안녕하세요?
임시객체에 대해서 공부하다가 이런 생각이 들었습니다.
함수의 매개변수와 함수 내부 변수는 스택에 올라가나요? 힙에 올라가나요?
함수 매개변수와 함수 내부 변수는 필요할때만 공간 할당되고 필요없을땐 해제되는 형식인가요?
올라가는 걸로 알고 있습니다. 뭐 꼭 그렇게 만들어야 한다고 되어 있는건 아닌걸로 알지만서도...
그러면 매개변수와 함수 내부 변수의 경우 스택에 올라가면, 올라갔다가 없어졌다가 자동으로 되는건가요?
이 작업을 할때, 내부적으로 동적메모리 할당 작업을 하는것인가요?
;;!?
http://www.ikpil.com
C++를 공부하고 계시는데 엉뚱한 말이 될 지도 모르겠습니다만... 함수 호출이 무엇을 의미하는지는 C나 C++나 대동 소이합니다.
C++이 복잡하기 때문에 함수 호출 또한 C보다 더 확장되어 있습니다.
확장됐다는 말은 기본 원리는 똑 같다는 말이니깐 공부하실 때는 기본이 되는 C를 공부하시고 C++는 그의 확장으로 보시면서 단계별로 접근하시는 것을 추천 드립니다.
지금 하신 질문은 함수호출에 대한 메커니즘을 질문 하신 겁니다. 실제 구현은 플렛폼 별로 다릅니다만...
x = func(a, b); int func(int a, int b) { return a + b; }
c -> asm -> 기계어
push b // b값을 stack에 push a // a값을 스텍에 call func1 // 함수 본체로 jump add stackP, 8 // 스텍포인터를 a, b값 넣기 이전으로 되돌리기 mov x registerA // registerA에 있는 값을 x로
호출 당하는 함수의 asm코드는
sub stackP, 4 // 스텍에 int 저장소 준비 mov [stackP], [stackP + 4] // a값을 int저장소에 복사 add [stackP], [stackP + 8] // b값을 int저장소에 더하기 mov registerA, [stackP] // 리턴할 값 registerA에 넣고 add stackP, 4 // int저장소 버리기 ret // 되돌아 가기
즉 매개변수는 스텍에 push해서 전달합니다. 함수의 내부변수(지역변수)도 스텍에 생성합니다. 리턴하기전에 지역에서 만든 변수는 버리고 (값은 그냥 두고 스텍포인터만 옮긴다는 말) 리턴할 값은 레지스터에 저장하고 리턴됩니다.
각 플렛폼별로 규칙은 바뀔 수 있습니다만... 스텍을 사용한다는 것은 대동소이 할 겁니다.
이해가 되었습니다!
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
스택에
올라가는 걸로 알고 있습니다.
뭐 꼭 그렇게 만들어야 한다고 되어 있는건 아닌걸로 알지만서도...
음
그러면 매개변수와 함수 내부 변수의 경우 스택에 올라가면,
올라갔다가 없어졌다가 자동으로 되는건가요?
이 작업을 할때, 내부적으로 동적메모리 할당 작업을 하는것인가요?
;;!?
http://www.ikpil.com
C부터 하시는 편이 좋으실지도...
C++를 공부하고 계시는데 엉뚱한 말이 될 지도 모르겠습니다만...
함수 호출이 무엇을 의미하는지는
C나 C++나 대동 소이합니다.
C++이 복잡하기 때문에
함수 호출 또한 C보다 더 확장되어 있습니다.
확장됐다는 말은 기본 원리는 똑 같다는 말이니깐
공부하실 때는 기본이 되는 C를 공부하시고 C++는 그의 확장으로 보시면서
단계별로 접근하시는 것을 추천 드립니다.
지금 하신 질문은 함수호출에 대한 메커니즘을 질문 하신 겁니다.
실제 구현은 플렛폼 별로 다릅니다만...
라는 컴파일 과정을 거친다고하면
호출하는 asm코드는 다음과 비슷하게 될 겁니다.
호출 당하는 함수의 asm코드는
와 같이 될겁니다.
즉 매개변수는 스텍에 push해서 전달합니다.
함수의 내부변수(지역변수)도 스텍에 생성합니다.
리턴하기전에 지역에서 만든 변수는 버리고 (값은 그냥 두고 스텍포인터만 옮긴다는 말)
리턴할 값은 레지스터에 저장하고
리턴됩니다.
각 플렛폼별로 규칙은 바뀔 수 있습니다만...
스텍을 사용한다는 것은 대동소이 할 겁니다.
감사합니다.
이해가 되었습니다!
http://www.ikpil.com
댓글 달기