c언어 함수 return value시 메모리 처리
글쓴이: poiq1 / 작성시간: 수, 2020/08/26 - 6:52오후
안녕하세요.
c언어 함수 리턴값에 대해서 궁금한게 있어서 이렇게 글을 작성하였습니다.
아래 함수는 간단한 합계를 계산하는 함수 입니다.
int sum(int a, int b)
{
int sum = 0;
sum = a + b;
return sum;
}
int main()
{
printf("sum : %d", sum(10,10);
}
sum 변수는 스택에서 할당된 메모리 이므로
함수를 빠져나갈 때 스택 영역이 파괴되어 sum 변수는 더 이상 사용할 수 없습니다.
따라서 리턴 후 sum의 값인 20이 저장된 메모리를 쓸 수 없지만
여기에서 제가 알기로는
return value에 한해서 sum 주소를 일시적으로 보호(?)한다로 알고 있는데요..
아니면 임시 메모리에 보관 후 리턴 처리 후 파괴인지...
정확한 개념이 정립되지 않아 혹시 어떤 방식으로 처리 되는지 궁금합니다.
답변 미리 감사드립니다.(__)
Forums:
함수에서 리턴 값을 스택에 쌓고, 호출 장소로
함수에서 리턴 값을 스택에 쌓고, 호출 장소로 돌아오게 되며, 호출한 측에서는 스택 상의 값을 꺼내어 사용하고 스택 포인터를 변경하게 됩니다.
이론적으로 스택을 사용하다가 맞지만 실제 구현은
이론적으로 스택을 사용하다가 맞지만 실제 구현은 다릅니다. 예를 들어 ARM은 레지스터를 사용해서 리턴을 처리하기도 합니다. 옵션에 따라 레지스터를 쓰지 않을 때도 있습니다. 따라서 무조건이라고 생각하시면 안되고 컴파일러의 구현과 타겟 아키텍쳐에 따라 다르다고 생각하시면 됩니다.
예를 들어 본문의 간단한 sum() 함수에서 파라메터 a, b는 스택이 아니라 레지스터 R0, R1로 전달받고, sum도 스택이 아니라 R2일 수 있습니다. 그리고 리턴하기 직전에 R2를 R0에 복사하고 함수는 끝납니다. 호출하는 쪽에서도 R0을 읽어서 결과를 받지요.
이렇게 레지스터가 있는 아키텍처이고 함수가 충분히 작으면 아예 스택을 쓰지 않기도 합니다.
----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라
윗분들이 너무 전문적인 답글을 달아주셨네요
윗분들이 너무 전문적인 답글을 달아주셨네요
전 초보니까 초보적으로..ㅋㅋ
개념적으로는 sum 함수가 실행되고 나서 해당 결과를 반환 받는 겁니다.
sum 함수의 내부에 있는 변수들은 함수 실행이 끝나면 사라지고 해당 값만 복사되서 넘어오는거죠
해당 값은 printf 함수에 인자로 넘어가면서 임시변수로 할당된다고 보시는게 맞겠네요
------------------------------------------------------------
ProgrammingHolic
댓글 달기