본문 바로가기

Programing/C/C++/STL

[C++]C++의 메모리 영역

http://mumbi.net/292

 메모리 영역  특성들과 개체 활동 주기 
 상수 데이터( Const Data )   
 상수 데이터 영역은 문자열과 컴파일 시점에서 값을 알 수 있는 다른 데이터들을 저장합니다. 클래스 형식의 개체는 이 영역에 존재할 수 없습니다. 

 이 영역의 모든 데이터는 프로그램의 전체 활동 주기 동안 가능합니다. 게다가, 이 모든 데이터는 읽기 전용이며, 이를 수정하면 정의되지 않은 결과를 얻게 됩니다. 기반을 이루는 저장 형식 조차 구현에 의한 전체적인 최적화 대상이 되는 까닭에, 일부만 저장됩니다. 예를 들어, 특정 컴파일러는 부가적인 최적화를 위해 문자열을 겹치는 개체들에 저장하는 것을 선택하기도 합니다.

스택( Stack )
 스택은 자동 변수들을 저장합니다. 개체들은 정의되는 순간에 바로 생성되며, 같은 범위의 마지막에 바로 소멸됩니다. 따라서, 프로그래머들이 직접적으로 할당된 개체들을 다룰 기회는 없지만 ( 명시적인 소멸자와 new 대체를 사용하여 고의적인 간섭없이는 ) 스택 공간은 초기화하지 않습니다.

 스택 메모리 할당은 전형적으로 각 스택 메모리 할당이 더 복잡한 관리를 요구하지 않고 단지 스택 포인터만 포함하고 있으므로 동적 저장 공간( 힙 또는 자유 공간 ) 보다 더 빠릅니다. 

자유 공간( Free Store )
 자유 공간은 new/delete 에 의해 할당/해제되는 두 개의 동적 메모리 영역 중에 하나입니다.

 개체 활동 주기는 저장소가 할당된 시간보다 짧을 수 있습니다. 즉, 자유 공간 개체들은 바로 메모리가 초기화되지 않고도 할당될 수 있습니다. 또한, 바로 메모리가 해제되지 않고도 파괴될 수 있습니다. 저장소가 할당되었지만 개체의 활동 주기 외의 기간 동안 저장소는 void* 를 통해서 접근하고 조작할 수 있습니다. 하지만, 원시 개체( proto-object )의 비정적 멤버들이나 멤버 함수들은 접근할 수 없습니다. 이들의 주소를 알아올 수도, 다른 조작을 가할 수도 없습니다.

 힙( Heap )
 힙은 malloc()/free()와 그 변형들에 의해 할당/해제되는 다른 동적 메모리 영역입니다.

 특정 컴파일러에서 기본 전역 연산자들 new와 delete가 malloc()과 free()에 의해 구현되는 동안, 힙은 자유 공간과 다르게 됨을 주목합시다. 그리고 어느 영역에서 하였던 메모리 할당은 다른 영역에서 안전하게 해제될 수 없습니다.

 힙에서의 메모리 할당은 new 생성자와 명시적인 소멸자를 대체하여 클래스의 개체에 사용할 수 있습니다. 이렇게 사용된다면, 자유 공간 개체 활동 주기와 유사하게 여기에서도 적용된다는 것을 주목하시기 바랍니다.
   
전역/정적( Global/Static )
 전역 혹은 정적 변수들과 개체들은 프로그램이 시작하는 시점에 그들의 저장소를 가지고 있습니다. 하지만 프로그램이 실행될 때까지 초기화되지는 않습니다. 예를 들어, 함수 내의 정적변수는 그 정의를 통해 첫 번째 프로그램 실행이 지나갈 때에 초기화됩니다.

 변환된 유닛에 상관없이 전역 변수들의 초기화 순서는 정의되지 않았습니다. 그리고, ( 클래스 정적 멤버를 포함하여 ) 전역 개체들간에 특별한 의존성 관리가 필요합니다. 여느 때와 같이, 초기화되지 않은 원시 개체들의 저장소는 void* 를 통하여 접근하거나 조작할 수 있지만, 어떤 비정적( nonstatic ) 멤버들이나 멤버 함수들을 개체의 실제 활동 주기 밖에서 사용하거나 참조할 수 없습니다. 

'Programing > C/C++/STL' 카테고리의 다른 글

[C/C++]메모리 영역 구분  (0) 2009.08.27
[C++] 멤버 함수포인터 사용하기  (0) 2009.07.22
[C++] explicit 키워드  (0) 2009.07.14
Source Code 수행속도 측정하는 방법  (0) 2009.06.30
OpenMP 라고 아십니까??  (0) 2009.06.30