[완료]C++ 함수의 매개변수, 함수 내부의 변수는 메모리의 어디에 올라 가나요?

ikpil의 이미지

안녕하세요?

임시객체에 대해서 공부하다가 이런 생각이 들었습니다.

함수의 매개변수와 함수 내부 변수는 스택에 올라가나요? 힙에 올라가나요?

함수 매개변수와 함수 내부 변수는 필요할때만 공간 할당되고 필요없을땐 해제되는 형식인가요?

김일영의 이미지

올라가는 걸로 알고 있습니다.
뭐 꼭 그렇게 만들어야 한다고 되어 있는건 아닌걸로 알지만서도...

ikpil의 이미지

그러면 매개변수와 함수 내부 변수의 경우 스택에 올라가면,
올라갔다가 없어졌다가 자동으로 되는건가요?

이 작업을 할때, 내부적으로 동적메모리 할당 작업을 하는것인가요?

;;!?

rhheo의 이미지

C++를 공부하고 계시는데 엉뚱한 말이 될 지도 모르겠습니다만...
함수 호출이 무엇을 의미하는지는
C나 C++나 대동 소이합니다.

C++이 복잡하기 때문에
함수 호출 또한 C보다 더 확장되어 있습니다.

확장됐다는 말은 기본 원리는 똑 같다는 말이니깐
공부하실 때는 기본이 되는 C를 공부하시고 C++는 그의 확장으로 보시면서
단계별로 접근하시는 것을 추천 드립니다.

지금 하신 질문은 함수호출에 대한 메커니즘을 질문 하신 겁니다.
실제 구현은 플렛폼 별로 다릅니다만...

x = func(a, b);
 
int func(int a, int b) {
    return a + b;
}
라는 함수호출을 하셨다고 하면 (a, b는 int)

c -> asm -> 기계어 

라는 컴파일 과정을 거친다고하면
호출하는 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해서 전달합니다.
함수의 내부변수(지역변수)도 스텍에 생성합니다.
리턴하기전에 지역에서 만든 변수는 버리고 (값은 그냥 두고 스텍포인터만 옮긴다는 말)
리턴할 값은 레지스터에 저장하고
리턴됩니다.

각 플렛폼별로 규칙은 바뀔 수 있습니다만...
스텍을 사용한다는 것은 대동소이 할 겁니다.

ikpil의 이미지

이해가 되었습니다!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.