2015-01-19 3 views
-1

구조체 내에서 패딩을 최소화하려면 가장 작은 요소를 가장 작게 선언해야합니다.C++ std :: vector 크기 연속적인 부분

std :: vector는 연속적 일 필요가없는 섹션에 메모리를 할당합니까?

구조체 내에서 패딩과 관련하여 struct 내에서 배치를 고려할 때 std :: vector를 몇 비트 씩 고려해야합니까?

+2

*** std :: vector는 반드시 연속적이지 않은 섹션에 메모리를 할당합니다. 맞습니까? *** 틀립니다. – drescherjm

+1

*** 구조체 내에서 패딩을 최소화하려면 가장 작은 요소를 가장 작게 선언해야합니다. 올바른 *** 구현이 정의되었습니다. – drescherjm

+1

@drescherjm : 당연히 역순은 일반적으로 똑같이 잘 작동합니다. – Deduplicator

답변

1

난 당신이 같은 것을 상상하고 가정합니다. std::vector 자체는 sizeof(std::vector) 바이트를 차지하므로, 패딩을 고려할 때 포함 된 구조체에 적어도이 많은 바이트를 제공합니다.

내부적으로 std::vector 개체는 요소가 저장된 다른 곳에서 연속적인 메모리 영역을 할당합니다. 크기를 늘리거나 줄이려면 요소를 추가하거나 제거 할 때 std::vector이 서로 다른 크기의 메모리를 할당 할 수 있습니다. 그러나이 메모리는 std::vector 크기에 영향을 미치지 않으므로 멤버가되는 구조체의 크기에 영향을 미치지 않으므로 이는 사용자의 질문에 영향을주지 않습니다.

+0

감사합니다. 그것은 내가 혼란스러워했던 것이었다. 데킬라는 남자에게 이상한 일을합니다. sizeof (std :: vector)를 컴파일하기 전에 객체 유형을 알 수 있지만 객체의 양은 저장하지 않도록 결정하는 좋은 방법은 무엇입니까? –

+0

@ Dr.McBucketO.ChickenM.D. 이것은 구현 방법에 완전히 달려 있으므로 말할 수 없습니다. 요소 유형은 효과가있을 것 같지 않습니다. –

4

구조체 내에서 패딩을 최소화하려면 가장 큰 요소를 가장 작게 선언해야합니다.

다릅니다. 어떤 경우에는 반드시 캐시 작동을 최적화해야 할 수 있습니다. 대부분의 구현에서 그런 방식으로 순서를 지정하면 가장 작은 크기의 구조 (최소 패딩 포함)가 발생하지만 표준이나 이와 유사한 것으로 보장되지는 않습니다. 1

성병 : 벡터는 반드시 올바른 인접하지 않은 부분에 메모리를 할당?

정확하지 않습니다. vector은 하나의 인접 섹션을 사용해야합니다. N3936 23.3.6.1/1을 참조하십시오.

vector은 임의 액세스 반복기를 지원하는 시퀀스 컨테이너입니다. 또한, (상각 된) 일정 시간 삽입 및 삭제 작업을 마지막에 지원합니다. 중간에 삽입하고 지우는 것은 선형 시간이 걸립니다. 스토리지 관리는 자동으로 처리되지만 효율성을 높이기위한 힌트를 제공 할 수 있습니다. 벡터의 요소는 연속적으로 저장됩니다. 즉, vvector<T, Allocator> 인 경우 이외의 형식 인 경우 T은 모두 0 <= n < v.size()입니다. 구조체 내에서

는 얼마나 많은 비트 나는 패딩에 대한 구조체 내에서의 위치를 ​​고려할 때이기 위하여 표준 : : 벡터를 고려해야한다?

벡터는 구조의 구성원에 대해 아무 것도 볼 수 없습니다. 그것은 단지 크기를 알고 있습니다.


1

4 바이트를 int S를 가지며 모든 5 바이트 정렬 될 필요 가상 기계를 고려한다. (나는 그런 기계의 모르겠지만, 표준은 기계가 가능할 것이다 방식으로 기록)이 경우 같은 구조 :

struct X 
{ 
    int a; 
    int b; 
    char c; 
    char d; 
}; 

낭비 할 공간

struct X 
{ 
    int a; 
    char c; 
    int b; 
    char d; 
}; 
때문에

은 각각 char이 사용되지 않은 5 바이트에 저장됩니다. 이것이 표준에서이 구현을 정의하는 이유입니다.

struct foo { 
    // ... 
    std::vector<T> vec; 
    // ... 
}; 

는 당신이 놓치고있는 것은이 std::vector 객체 자체와 그것의 요소에 할당하는 메모리의 차이라고 생각합니다 :