스택 메모리는 흔히 생각하듯이 변수a 변수b 이런 식으로 쌓여가면서 동작하지 않는다.
실제로 스택 메모리는 변수별로 쌓여가는 것이 아니라 Stack Frame 단위로 메모리를 쌓아가면서 동작한다.
이 Stack Frame은 Function 단위로 나누어지고 호출된다.
Call Stack
foo() 함수 내에서 a b 둘 중 누가 위에 위치할지는 컴파일러가 정해준다.
bar() 함수 내에서도 마찬가지.
main()함수 내에서도 마찬가지다.
(1) 함수가 실행되면 main 함수가 가장 먼저 실행되면서 쌓여진다.
(2) foo() 함수를 call 하면서 그 foo()의 stack frame을 그대로 가져와서 위에 쌓는다.
(3) foo() 함수가 끝나고 bar() 함수를 호출되면, foo() 부분 메모리를 없애고 bar() stack frame을 올려준다.
(4) bar() 함수가 끝나고 main() 함수가 끝나면서 전체적인 stack 메모리가 종료됨.
*즉 stack은 변수 단위로 쌓여 가는 것이 아니라, stack frame 단위로 한꺼번에 function call에 따라 쌓이고 해제된다.
*stack frame을 쌓아가는 과정에서 다른 정보가 같이 쌓일 수 있다.
이러한 정보의 순서는 컴파일러가 정해주지만 무엇이 들어가는지 알아두자.
실제로는 이 추가 정보까지 합쳐서 stack frame이라고 부른다.
밑의 예제를 보며 살펴보자.
1) argument 정보인 10이 추가 정보로 들어가게 된다.
2) Return address 정보가 추가로 들어가는데, 이것은 function call이 끝날 때 다음 명령어가 들어있는 주소를 같이 넣어주어서 함수 실행이 끝난 후에 이 주소 정보로 바로 다음 명령어를 실행시켜주면서 메모리를 해제해 주게 되는 것이다.
예제2)
멤버 변수로 나이 m_age 를 가지고 있는 cat 클래스를 만들고,
constructor에서 나이를 2살로 설정해주고,
addAge(int arg)를 만들어서 argument를 멤버 변수 m_age에 더해주는 함수를 만들었다.
stack frame은 항상 function 단위로 나뉘어진다는 것 명심.
각각의 함수에 stack frame이 존재한다고 가정해 보자.
Process
1) main() 함수의 stack frame이 위에 올라간다. - 고양이의 나이 정보인 cat.age가 들어가 있다.
: 4byte는 확보되어 있지만 아직 고양이의 나이 정보가 들어가는 메모리 공간으로 활용되지 않고 있다.
2) 생성자 Cat() stack이 올라가면서 cat.age가 2로 초기화 initialize된다.
: 아래쪽에 있는 메모리에 access해주기 위해 이 정보의 address를 갖고 있다. (this)
3) 생성자 함수가 끝나면서 메모리가 free 된다.
4) addAge(arg) 함수가 불러지면서 stack frame이 위에 올라간다.
: return instructor address가 함께 들어가고 arg(10) 이 메모리에 들어간다.
5) this 데이터가 stack frame에 함께 올라가게 된다(C++ 특징)
: this 키워드를 통해서 member variable을 컨트롤 해 주기 위해서.
현재의 this는 고양이 object의 address를 갖고 있게 된다. arg 정보10을 받아와서 this 정보를 읽어서 this가 가리키고 있는 메모리에 접근해서 12로 업데이트 해 준다. 이후 이 파트가 전부 메모리 해제된다.
6) destructor가 올라갔다 내려온 후에 프로그램이 종료된다.
this 키워드
: 현재 object의 address를 가리키는 키워드.
중요 포인트
: stack frame이 쌓여가는 도중에 member variable을 control 해주기 위해 member variable을 가리키는 address가 (this) 들어있다는 것.
'모던C++ > 메모리 구조 Memory Structure' 카테고리의 다른 글
7. 힙 스택 스태틱 Heap Stack Static - 언제 어떻게 사용해야 할까 (0) | 2022.07.06 |
---|---|
6. 힙 메모리 Heap Memory 에 대한 모든 것 (2) - 예제 + Memory Leak 메모리 릭 방지 (0) | 2022.07.01 |
5. 힙 메모리 Heap memory 에 대한 모든 것 - Heap vs Stack (0) | 2022.06.30 |
3. 메모리 속 변수 타입 Variable Types - Struct, class, 포인터의 크기 (0) | 2022.06.16 |
2. 메모리 속 변수 타입 Variable Types - sizeof(), Array, Pointer, int... (0) | 2022.06.16 |
1. 메모리 속 변수들에 대한 설명 - Stack 스택 (0) | 2022.06.16 |