gpt4 book ai didi

c++ - std::vector 中元素的字节对齐方式是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:03:07 26 4
gpt4 key购买 nike

我希望元素是 1 字节对齐的,类似于 std::vector<int>是 4 字节对齐的(或任何大小 int 恰好在特定平台上)。

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

最佳答案

容器的元素至少在该实现中具有它们所需的对齐方式:if int在您的实现中是 4 对齐的,那么 vector<int> 的每个元素是一个 int因此是4对齐的。我说“如果”是因为大小和对齐要求之间存在差异 - 只是因为 int就标准而言,大小为 4 并不一定意味着它必须是 4 对齐的。不过,这很常见,因为 int通常是机器的字长,并且大多数机器在字边界上的内存访问方面具有优势。所以对齐 int 是有意义的即使这不是绝对必要的。例如,在 x86 上,您可以执行未对齐的字大小内存访问,但它比对齐的要慢。在 ARM 上不允许未对齐的字操作,并且通常会崩溃。

vector保证连续存储,因此 vector<char> 的第一个和第二个元素之间不会有任何“填充” ,如果这就是您所关心的。 std::vector的具体要求是0 < n < vec.size() , &vec[n] == &vec[0] + n .

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

C++ 中的每个对象都是 1 对齐的,唯一不是的是位域,以及边界线疯狂特例的元素 vector<bool> .所以您可以放心,您对std::vector<char>的希望是有根据的。 vector 及其第一个元素也可能是 4 对齐的;-)

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

关于c++ - std::vector<char> 中元素的字节对齐方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3658631/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com