2008. 10. 8. 18:19 책 정리/Exceptional C++

메모리에 대해서 얼마나 많이 알고 있나? 어떤 다른 메모리 영역이 있나? 이 문제는 C++의 주요한 독립적인 메모리 저장소에 기초를 두며, 좀 더 자세히 이해하여 메모리 관리를 보다 효율적으로 할 수 있는것에 초점을 둔다.

 

문제 : C++의 주요한 독립적인 메모리 저장소는 무엇이 있나?

 

 

해설

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

이 영역의 모든 데이터는 프로그램의 전체 활동주기 동안 가능하다. 게다가, 이 모든 데이터는 읽기 전용이므로, 이를 수정하면 정의되지 않은 결과가 나온다.

이곳에 저장을 하는것은 컴파일러에 의해 결정 되므로, 구현이 다르면 다른 결과를 얻기도 한다. 예를 들자면 문자열이 겹치는 것은 같은 메모리 주소로 갖게 된다.
스택(Stack) 스택은 자동 변수를 저장한다. 개체들은 정의되는 순간에 바로 생성되며, 같은 범위의 마지막에 바로 소멸된다. 따라서 프로그래머들이 직접적으로 할당된 개체를 다룰 기회는 없으며,( new (&t) T() 처럼 사용 할 수 있지만...)  스택 공간은 초기화하지 않는다.

스택 메모리 할당은 전형적인 각 스택 메모리 할당이 더 복잡한 관리를 요구하지 않고, 단지 스택 포인터 증가만 포함하고 있으므로 동적 저장 공간보다 더 빠르다.
자유 공간(Free Store) 자유 공간은 두 개의 동적 메모리 영역 중에 하나이며 new/delete 로 인하여 사용 되어 진다.

개체 활동주기는 저장소가 할당된 시간보다 짦을 수 있다. 이것은 자유 공간 개체들이 메모리 초기화되지 않고도 할당 될 수 있다는 것을 뜻한다.

이것은 할당 되지 않은 개체를 해제하지도 않고 파괴 할 수도 있다.

또한, 개체의 활동주기 외의 기간동안 저장소는 void*를 통하여 얻어 올수 있으며, 접근이 할 수 있다. 하지만 원시 개체의 비정적 멤버들이나 멤버 함수들은 접근 할 수 없다.
힙(Heap) malloc()/free()와 그 변형들이 할당/해제되는 다른 동적 메모리 공간이다.

특정 컴파일러에서 기본 전역 연사자(new delete)가 malloc과 free로 구현된다면, 자유 공간에서 힙으로 바뀐다.

new 생성자와 명시적인 소멸자로 마치 자유 공간 개체 활동주기와 유사하게 사용 할수 있다.
전역/정적(Global/Static) 전역 혹은 정적 변수들과 개체들은 프로그램 시작하는 시점에 그들의 저장소를 가지고 있따. 하지만 프로그램 실행 될 때까지 초기화 되지 않는다.

정적 변수는 프로그램 실행이 그 변수를 지나갈때 초기화가 된다. 변환된 유닛에 상관 없이 전역 변수들의 초기화 순서는 정의 되어 있지 않다.(그래서 전역 변수가 여러 파일에 있다면 약간 위험하다)

초기화 되지 않은 객체는 void*를 통하여, 접근하거나 조작 가능하지만, 어떤 멤버들이나 멤버 함수들은 개체의 실제 활동 주기 밖에서는 사용 되거나 참조 될 수 없다.

 

그리고 부연 설명이로 이런 글을 포함시켰다.

  1. malloc 으로 new를 구현해도 되나, new로 malloc 을 구현 하지 말라.
  2. 함수 free()는 ::operator delete()를 호출하여, 해제를 시도해서는 안된다.

이것은 강제 사항이다.

이 뜻을 해석해 보면, 자유공간과 힙공간은 엄연이 다르게 된다. 그렇다면 무엇이 다를까?

 

자유공간은 스택도 쓰고 힙도 쓴다. 그렇다면 자유 공간은 도데체 무엇일까?

얼마 안되는 문서가지고 몇가지 추론을 해 보았다.

  1. 자유 공간은 OS에서 관리해 주는 공간이다.
  2. 자유 공간은 순수한 메모리 덩어리 이다.
  3. 자유 공간 영역을 힙 영역으로 만들어 주는것이 malloc 이다.
  4. 힙 영역은 자유 공간을 기반으로 만들어 진다.

 

이 추론을 통하여 new의 기능을 추론해 본다.

  1. new 두개의 new로 만들어 졌다.
  2. 특정 컴파일러에서 new는 malloc으로 구현됨으로써 자유 공간의 메모리를 힙으로써 보호한다. 만약 malloc 으로 구현 안되어 있다면, 스택 또는 다른 자유공간 할당에 의하여 기존 할당된 영역을 보호하는 매카니즘을 제공해야 한다.
  3. 자유공간이든 힙 공간이든 할당된 메모리에 생성자를 호출한다.

 

총평

어떻게 된건지 정확하게 나온 문서가 없어 추론 할 수밖에.. 사용자 입장에선 스택과 힙만 생각하면 될 듯 싶다. 단지 특정 공간에 생성자를 호출하고 싶다면 new를 사용하면 된다는 기억만 하면 될 듯 싶다.

posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요