std :: vector <char>中元素的字节对齐是什么?

Bee*_*and 5 c++ memory stl

我希望这些元素是1字节对齐的,并且类似于a std::vector<int>4字节对齐(或者int特定平台上的任何大小).

有谁知道标准库容器如何对齐?

Ste*_*sop 9

所述容器的所述元件具有至少在实施它们所需的对准:如果int是在您的实施4对齐,然后的每个元素vector<int>是一个int,因此是4对齐.我说"if"因为尺寸和对齐要求之间存在差异 - 仅仅因为int尺寸4并不一定意味着它必须是4对齐的,就标准而言.但这很常见,因为int通常是机器的字大小,并且大多数机器都具有字边界内存访问的优势.因此,对齐是有意义的int即使它不是绝对必要的.例如,在x86上,您可以执行未对齐的字大小的内存访问,但它比对齐慢.在ARM上,不允许使用未对齐的字操作,并且通常会崩溃.

vector保证连续存储,因此在a的第一个和第二个元素之间不会有任何"填充" vector<char>,如果你关心的话.具体要求std::vector0 < n < vec.size(),&vec[n] == &vec[0] + n.

[编辑:此位现在无关紧要,提问者已消除歧义:无论value_type是什么,容器本身通常都会有指针所需的对齐方式.这是因为向量本身通常不会包含任何元素,但是会有一个指针指向一些动态分配的内存以及其中的元素.这不是明确要求的,但它是一个可预测的实现细节.]

C++中的每个对象都是1对齐的,唯一不是bitfield的对象,以及borderline-crazy特殊情况的元素vector<bool>.所以你可以放心,你的希望std::vector<char>是有充分根据的.向量及其第一个元素也可能是4对齐的;-)

至于它们如何对齐 - 就像C++中的任何内容一致.从堆中分配内存时,需要对任何适合分配的对象进行充分对齐.当对象放在堆栈上时,编译器负责设计堆栈布局.调用约定将指定堆栈指针在函数入口上的对齐,然后编译器知道它放下的每个对象的大小和对齐要求,因此它知道堆栈是否需要任何填充以使下一个对象进入正确的对齐.