C++ - 메모리 영역

메모리 영역에 대해서

5 종류의 메모리 영역

C++ 에서는 다른 특성을 갖는 5 종류의 메모리 영역이 존재한다.
(※ 단 c++ 규격에는 스택이나 힙은 명시 하지 않고 Free-Store는 명시 하고 있다)

Const Data

컴파일 시 값을 알 수 있는 데이터(예를 들면 static 지정된 클래스 상의 변수와 글로벌 변수, 문자열 리터럴 등)가 이곳에 저장된다.
다만 클래스 객체는 저장할 수 없다.
Const Data에 저장되어 있는 값은 프로그램이 종료하지 않는 한 이용 가능하다.
또 값은 읽기 전용으로 변경할 수 없다.
규격으로 규정되어 있다.
포인터를 사용하면 변경이 가능한 환경도 있지만 결과가 어떨지 보증되지 않는다.
자신의 환경에서는 잘 돌아가도 다른 환경에서는 예를 들면 OS에 의해 프로그램이 강제 종료될 수 있다.

Stack

자동 변수가 저장된다.
변수는 선언과 동시에 작성·배당이 이뤄지고 그 개체가 만들어진 스코프에서 나오면 파기되고 할당이 해제된다.
그래서 초기화가 이루어지지 못한 영역을 배정 받지 않는다.
확보된 연속된 메모리와 스택 포인터의 증감으로 구현 되어 있으며 메모리의 할당 속도는 동적 스토리지로 힙이나 프리 스토어보다 훨씬 빠르다. 그러나 이들 동적 스토리지에 비하면 매우 크기가 작다.
그래서 프로그램을 쓸 때는 스택 메모리의 사용은 필요 최소한으로 해야 한다.
너무 사용하면 스택 오버 플로가 발생하여 프로그램이 강제 종료된다.

Free-Store(메모리 풀이라고 생각해도 될 듯)

new, delete로 할당 해제 되는 2개의 동적 메모리 영역 중의 하나이다.
다만 여기서 말하는 힙과 프리 스토어는 개념적인 것이다.
힙과 프리 스토어는 같은 영역이 아니라고 가정했을 경우에 어느 쪽에서 확보한 메모리를 다른 쪽에서 안전하게 해방할 수 없는 것은 쉽게 상상이 간다.
또한 변수의 존재 기간을 메모리가 할당되어 있는 시간보다도 짧게 할 수 있다.
즉, 프리 스토어에 있는 변수는 바로 초기화 되지 않고 메모리가 할당될 가능성이 있고, 메모리가 바로 할당 해제되지 않고 파괴될 가능성이 있다.

Heap

malloc, free에 의해서 할당 해제 되는 2개의 동적 메모리 영역 중의 하나이다.
힙에서 할당된 메모리는 클래스 타입 객체에 사용할 수 있다.
그래서 프리 스토어 객체에 관한 주의 사항도 여기서 똑같이 적용된다.

Global/Static

글로벌 변수 또는 정적 변수 및 객체는 프로그램의 기동 시에 할당된 기억 영역을 갖고 있지만, 프로그램 실행이 개시 될 때까지는 초기화되지 않는다.
예를 들면 함수 내의 정적 변수는 프로그램 실행이 그 정의를 지날 때 초기화된다.
번역 단위 전체의 글로벌 변수 초기화 순서는 정의되어 있지 않다.
글로벌 오브젝트들 간의 의존 관계를 관리하려면 주의가 필요하다.
초기화 되지 않은 프로토 타입의 기억 영역은 항상 void*를 사용하여 접근하거나 조작할 수 있었지만 비 정적 멤버 및 멤버 함수는 객체의 실제 수명의 밖에서 사용 또는 참조할 수 없다.



출처: http://www.xn–48j1a2f2b.com/%E3%83%A1%E3%83%A2%E3%83%AA%E9%A0%98%E5%9F%9F%E3%81%A8new%E6%BC%94%E7%AE%97%E5%AD%90%E3%81%AE%E6%9C%89%E7%84%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/

참고: 참고: C++, Free-Store vs Heap


이 글은 2017-05-29에 작성되었습니다.