본문 바로가기

C++ Programming/Exceptional C++ style

C++ 메모리 사용의 궁금증

1. new나 malloc으로 메모리 n바이트를 요청했을때 실제로 n바이트를 얻게 될까?

프로그램이 요청한 메모리 + 관리용 정보

a) struct x1{
      char c1;
       long l;
      char c2;
    };

b) struct x2{
      long l;
      char c1;
      char c2;
    };

a) c 컴파일러는 보통 4바이트로 메모리를 관리하기 때문에 오프셋 0 : char형 1바이트 + 오프셋 2~4 : 세개의 채움 바이트
     오프셋 4~7 :  long형에 할당 , 오프셋 8 : char형 1바이트 ,오프셋 9~11 : 세개의 채움 바이트(채움 : 관리용 정보)
 b) 연속적인 메모리 할당, 오프셋 0~3 : long형 할당, 오프셋 4: char형 할당, 오프셋 5:char형 할당

2) 여러 컨테이너들의 객체당 기본 추가부담
   a) vector - 추가부담없음(연속적인 c 스타일을 배열)
   b) deque - 추가부담거의없음. 일반적으로 1비트의 소주 수준
   c) list - 포인터 2개 (이전노드와 다음노드를 가리키는 포인터)
   d) set, multiset - 포인터 3개(왼쪽자식,오른쪽자식,부모노드로 올라가는 포인터)
   e) map,multimap  - pair<const key, T>당 포인터 3개

   a)vector - 객체들을 개별적으로 할당된다. 
   b)deque - 객체들을 페이지별로 할당되며, 거의 할당 각 페이지는 많은 객체들을 저장한다. 
   c)list - struct LNode{
                  LNode* prev;
                  LNode* next;
                  T object;};
   d)set, multiset - struct SNode{
                             SNode * prev;
                             SNode * next;
                             SNode * parent;
                             T object;};
   e)map, multimap - struct MNode{
                             MNode* prev;
                             MNode* next;
                             MNode* parent;
                             std::pair<const Key,T> data;
                             };
정리 - 각각의 컨테이너는 서로 다른 공간 대 성능 상의 절충을 선택한다. vector와 set으로는 효율적으로 할 수 있지만 list는 효율적으로 할 수 없는 것들이 있다. 예를 들면 O(logN)검색이 그렇다. vector로는 효율적으로 할 수 있지만 list나 set으로는 효율적으로 할 수 없는 것들도 있다. 요소에 임의로 접근하는 것이 그 예이다. 또한 list로는 효율적으로 할 수 있지만 set으로는 덜 효율적인, 그리고 vector로는 매우 느린것들도 있다. 컨테이너중간에 요소를 삽입하는 것이 그 예이다.