字符数组的对齐

Arm*_*yan 5 c++ alignment

通常如何实现STL向量?它有一个char []的原始存储,偶尔会按一定因子调整大小,然后在push_back元素时将其放置为new(我应该注意这是一种非常有趣的语法形式-语言学家应该研究诸如push_back之类的动词形式:)
然后在那里是对齐要求。因此出现一个自然的问题,我如何才能在char []上调用新的展示位置,并确保满足对齐要求。因此,我在2003年的C ++标准中搜索“ alignment”一词,发现了以下内容:

第3.9条第5款

对象类型具有对齐要求(3.9.1、3.9.2)。完整对象类型的对齐方式是一个实现定义的整数值,表示字节数。在满足其对象类型对齐要求的地址处分配对象。

第5.3.4节第10条:

一个new表达式将请求的空间量作为std :: size_t类型的第一个参数传递给分配函数。该参数应不小于所创建对象的大小;仅当对象是数组时,它才可能大于要创建的对象的大小。对于char和unsigned char数组,new-expression的结果与分配函数返回的地址之间的差应为大小不大于任何对象类型的最严格对齐要求(3.9)的整数倍。正在创建的数组的大小。[注意:由于假定分配函数将指针返回到针对任何类型的对象适当对齐的存储,这种对数组分配开销的约束允许分配字符数组的通用习惯,以后将其他类型的对象放入字符数组中。]

这两个给我上述问题提供了一个完全令人满意的答案,但是...

声明1:
X类型对象的对齐要求,其中sizeof(X)== n至少是X的地址可被n或类似的东西整除的要求(将所有与体系结构相关的事物放入“或类似那”)。

问题1:请确认,完善或拒绝上述声明1。

语句2:如果语句1是正确的,则从标准的第二个引号开始,可以得出一个5000000个字符的数组分配给可被5000000整除的地址,如果我只需要这样的字符数组而不是原始存储,则完全不需要用于放置其他物体。

问题2:那么,成功分配1000个字符的机会是否真的少于500个short(假设short为2个字节)?这实际上是一个问题吗?

Ste*_*sop 3

X 类型对象的对齐要求,其中 sizeof(X) == n 至少要求 X 的地址可以被 n 整除或类似的东西

不。类型的对齐要求始终是其大小的一个因素,但不必等于其大小。它通常等于类中所有成员的最大对齐要求。

一个 5M 字符的数组,就其本身而言,只需要对齐要求为 1,与单个 的对齐要求相同char

因此,您引用的有关通过全局运算符分配的内存对齐的文本new(并且malloc具有类似但 IIRC 不相同的要求)实际上意味着大型分配必须遵守系统中任何类型的最严格的对齐要求。此外,实现通常会排除大型 SIMD 类型,并要求专门为 SIMD 分配内存。这有点可疑,但我认为他们的理由是非标准的扩展类型可以强加任意的特殊要求。

所以在实践中,你认为的 5000000 这个数字通常是 4 :-)