2013-08-03 3 views
1

std :: vector는 연속적인 메모리 레이아웃을 제공하는 반면 std :: list는 링크 된 메모리 레이아웃을 제공하고 내 질문은 std의 메모리 레이아웃이 무엇인지 알고 있습니다. : 벡터 < std :: list>? std :: list의 내용을 포함하고 있거나 목록에 대한 포인터가 여러 개 포함되어 있습니까?std :: vector 및 std :: list 메모리 레이아웃

+2

'std :: vector '('T = bool '이 아니면)과 동일합니다 :'T'의 배열을 포함합니다. 이 경우, 그것은'std :: list' 배열입니다. – nneonneo

+0

@nneonneo : OP 자체가 벡터의 요소 인 경우 벡터에 목록의 요소가 포함되어 있는지 궁금해합니다. –

+0

글쎄, 그 경우 대답은 분명히 아니오입니다. 'std :: vector'는'T'가 복사 가능한지 상관하지 않습니다. (원칙적으로 다른 컨테이너를 운반하는 전문 분야가있는 컨테이너를 설계 할 수 있습니다 ...) – nneonneo

답변

3

은 각 요소를 연결된 목록으로 연결된 서로 다른 메모리 위치에 유지하지만 실제로 목록의 머리글 구조에는 작은 메모리 영역이 필요합니다. std::list<T>의 인스턴스를 만들 때 할당되는 것은이 구조체입니다.

std::list<T>의 벡터 메모리의 연속 영역에 할당 된 개별 연결리스트에 대한 이러한 "헤더"항목으로 구성되어

:

그것은 다른 std::vector<T> (T=bool하지 않는 한)과 동일합니다 Vector of Lists

+0

당신의 회화 설명은 명확하고, 나는 그것을 얻었다 고 생각합니다. – JavaBeta

1

: 배열은 T입니다. 이 경우 std::list의 배열입니다. std::list 객체는 기본적으로 "포함하는"객체 목록에 대한 부기 구조입니다. 실제 요소는이 구조 외부에 별도로 할당 된 청크에 있으므로 (따라서 std::vector<std::list<T> >이 관리하는 메모리 블록 외부에 있음).

std::vector은 복사가 가능한 한 T이 무엇인지 신경 쓰지 않습니다. 원칙적으로 다른 컨테이너를 운반하는 전문화 된 컨테이너를 설계 할 수는 있지만 이는 std::vector의 작동 방식이 아닙니다.

관련 문제