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;
프로그램이 요청한 메모리 + 관리용 정보
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로는 매우 느린것들도 있다. 컨테이너중간에 요소를 삽입하는 것이 그 예이다.
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로는 매우 느린것들도 있다. 컨테이너중간에 요소를 삽입하는 것이 그 예이다.