구조체 내에서 패딩을 최소화하려면 가장 작은 요소를 가장 작게 선언해야합니다.C++ std :: vector 크기 연속적인 부분
std :: vector는 연속적 일 필요가없는 섹션에 메모리를 할당합니까?
구조체 내에서 패딩과 관련하여 struct 내에서 배치를 고려할 때 std :: vector를 몇 비트 씩 고려해야합니까?
구조체 내에서 패딩을 최소화하려면 가장 작은 요소를 가장 작게 선언해야합니다.C++ std :: vector 크기 연속적인 부분
std :: vector는 연속적 일 필요가없는 섹션에 메모리를 할당합니까?
구조체 내에서 패딩과 관련하여 struct 내에서 배치를 고려할 때 std :: vector를 몇 비트 씩 고려해야합니까?
난 당신이 같은 것을 상상하고 가정합니다. std::vector
자체는 sizeof(std::vector)
바이트를 차지하므로, 패딩을 고려할 때 포함 된 구조체에 적어도이 많은 바이트를 제공합니다.
내부적으로 std::vector
개체는 요소가 저장된 다른 곳에서 연속적인 메모리 영역을 할당합니다. 크기를 늘리거나 줄이려면 요소를 추가하거나 제거 할 때 std::vector
이 서로 다른 크기의 메모리를 할당 할 수 있습니다. 그러나이 메모리는 std::vector
크기에 영향을 미치지 않으므로 멤버가되는 구조체의 크기에 영향을 미치지 않으므로 이는 사용자의 질문에 영향을주지 않습니다.
감사합니다. 그것은 내가 혼란스러워했던 것이었다. 데킬라는 남자에게 이상한 일을합니다. sizeof (std :: vector)를 컴파일하기 전에 객체 유형을 알 수 있지만 객체의 양은 저장하지 않도록 결정하는 좋은 방법은 무엇입니까? –
@ Dr.McBucketO.ChickenM.D. 이것은 구현 방법에 완전히 달려 있으므로 말할 수 없습니다. 요소 유형은 효과가있을 것 같지 않습니다. –
구조체 내에서 패딩을 최소화하려면 가장 큰 요소를 가장 작게 선언해야합니다.
다릅니다. 어떤 경우에는 반드시 캐시 작동을 최적화해야 할 수 있습니다. 대부분의 구현에서 그런 방식으로 순서를 지정하면 가장 작은 크기의 구조 (최소 패딩 포함)가 발생하지만 표준이나 이와 유사한 것으로 보장되지는 않습니다. 1
성병 : 벡터는 반드시 올바른 인접하지 않은 부분에 메모리를 할당?
정확하지 않습니다. vector
은 하나의 인접 섹션을 사용해야합니다. N3936 23.3.6.1/1을 참조하십시오.
vector
은 임의 액세스 반복기를 지원하는 시퀀스 컨테이너입니다. 또한, (상각 된) 일정 시간 삽입 및 삭제 작업을 마지막에 지원합니다. 중간에 삽입하고 지우는 것은 선형 시간이 걸립니다. 스토리지 관리는 자동으로 처리되지만 효율성을 높이기위한 힌트를 제공 할 수 있습니다. 벡터의 요소는 연속적으로 저장됩니다. 즉,v
이vector<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
객체 자체와 그것의 요소에 할당하는 메모리의 차이라고 생각합니다 :
*** std :: vector는 반드시 연속적이지 않은 섹션에 메모리를 할당합니다. 맞습니까? *** 틀립니다. – drescherjm
*** 구조체 내에서 패딩을 최소화하려면 가장 작은 요소를 가장 작게 선언해야합니다. 올바른 *** 구현이 정의되었습니다. – drescherjm
@drescherjm : 당연히 역순은 일반적으로 똑같이 잘 작동합니다. – Deduplicator