이글은 "전문가를 위한 c++(개정4판)"을 학습한 내용을 직접 실습해보며 정리한 Review용 글입니다.
스택과 힙
c++ 프로그램이 사용하는 메모리는 크게 스택(stack) 영역과 힙(heap) 영역으로 나뉩니다. 물론 세부적으로 코드와 데이터 영역이 추가적으로 있지만 여기서는 다루지 않겠습니다. 스택은 말 뜻처럼 아래에서 위로 데이터를 차곡차곡 쌓아가는 모습입니다.(반대로 꺼낼때도 위에서부터 꺼내야합니다.)
스택은 주로 함수와 관련된 매개 변수와 지역변수가 저장되기 때문에 이를 별도로 스택 프레임(stack frame)이라고 부릅니다. 제일 위에 놓이는 스택 프레임은 현재의 스코프를 표현하며 주로 현재 실행중인 함수를 가리킵니다. 즉 현재 실행 중인 함수에 선언된 변수는 모두 최상단 스택 프레임에 담겨있다는 뜻입니다.
현재 foo()라는 함수가 실행된 상태에서 bar()라는 다른 함수를 호출하면 foo()함수 위로 bar()함수의 스택 프레임이 올라옵니다. foo()에서 bar()로 전달되는 매개변수는 모두 bar()의 스택 프레임으로 복제가 됩니다.
스택 프레임은 각각의 함수마다 독립적인 메모리 공간을 제공합니다. 함수에 대한 스택 프레임에 변수가 선언되어 있을 때 bar()함수를 호출하더라도 특별히 수정하지 않는 한 그 변수는 그대로 유지됩니다. 또한 호출된 함수의 실행이 끝나면 호출함수의 스택프레임이 삭제가 되기 때문에 그 안에 선언된 변수는 더 이상 메모리를 차지하지 않습니다. 스택에 할당된 변수는 사용 후 자동으로 삭제되기 때문에 프로그래머가 직접 할당 해제를 할 필요가 없습니다.
힙(heap)은 스택과는 다른 완전히 독립적인 공간입니다. 함수가 끝난 후에도 그 안에서 사용하던 변수를 계속 유지하고 싶으면 힙에 저장해야합니다. 힙은 원하는 시점에 언제든지 동적으로 할당이 가능합니다. 하지만 스택과는 다르게 자동으로 해제되지 않기 때문에 반드시 직접해제를 해야합니다. 메모리 해제에 대한 크러쉬(crush)가 발생하면 프로그램에 치명적일 수 있기 때문에 c++에서는 스마트 포인터라는 개념을 도입해서 사용합니다. 이에 대한 언급은 나중에 하겠습니다.
추가적으로 스택과 힙에 대한 장단점에 대해서 언급하겠습니다. 스택의 경우 CPU상에 존재하는 메모리에 할당되기 때문에 엑세스가 매우 빠릅니다. 다만 OS에 따라 다르지만 스택 크기가 작은 공간으로 고정되어 있어서 변수의 크기를 조정할 수 없습니다. 힙의 경우는 물리적으로 CPU가 아닌 별도의 RAM에 저장합니다. 스택에 비해 엑세스가 상대적으로 느리지만 변수의 크기가 메모리 크기에 의해 제한되기 때문에 허용 가능치까지 크기를 조정할 수 있습니다.
'Program Language > c++' 카테고리의 다른 글
c++ 기초(동적 배열 할당) (0) | 2023.01.13 |
---|---|
c++ 기초(포인터 사용법) (0) | 2023.01.12 |
C++ 기초(이니셜라이저 리스트) (0) | 2023.01.10 |
c++ 기초(반복문(while, do/while, for, 범위 기반 for)) (0) | 2023.01.09 |
C++ 기초(구조적 바인딩) (0) | 2023.01.09 |
댓글