60

分配缓冲区,new char[sizeof(T)]保证分配与 type 正确对齐的内存T,其中所有成员T都有其自然的、实现定义的对齐方式(也就是说,您没有使用alignas关键字来修改它们的对齐方式)。

我在这里的一些答案中看到了这个保证,但我并不完全清楚标准是如何达到这个保证的。标准的5.3.4-10给出了基本要求:本质上new char[]必须对齐max_align_t

我缺少的是那个说alignof(T)总是与最大值的有效对齐的位max_align_t。我的意思是,这似乎很明显,但是结构的最终对齐方式是否最多max_align_t?甚至第 3.11-3 点说可能支持扩展对齐,所以编译器可以自己决定一个类是过度对齐的类型吗?

4

2 回答 2

18

表达式new char[N]new unsigned char[N]保证返回与任何对象充分对齐的内存。参见 §5.3.4/10 “[...] 对于 char 和 unsigned char 数组,new-expression 的结果与分配函数返回的地址之间的差异应是最严格的基本对齐要求的整数倍(3.11) 的任何对象类型,其大小不大于正在创建的数组的大小。[注意:因为分配函数被假定返回指向存储的指针,该指针对于具有基本对齐的任何类型的对象进行了适当对齐,这个约束在数组分配开销允许分配字符数组的常见习惯用法,稍后将在其中放置其他类型的对象。-尾注]"。

当然,从风格的角度来看:如果您想要分配原始内存,那么这样说会更清楚:operator new(N). 从概念上讲, new char[N]创造N charoperator new(N)分配N字节。

于 2012-05-14T18:31:10.590 回答
6

我缺少的是那个说alignof(T)总是与最大值的有效对齐的位max_align_t。我的意思是,这似乎很明显,但是结构的最终对齐方式是否最多max_align_t?甚至第 3.11-3 点说可能支持扩展对齐,所以编译器可以自己决定一个类是过度对齐的类型吗?

正如 Mankarse 所说,我能得到的最好的报价来自[basic.align]/3

具有扩展对齐要求的类型是过度对齐类型。[注意:每个过度对齐的类型都是或包含一个应用扩展对齐的类类型(可能通过非静态数据成员)。——尾注]

这似乎意味着必须明确要求扩展对齐(然后传播),但不能

我希望更清楚地提及;对于编译器编写者来说,意图是显而易见的,任何其他行为都是疯狂的,仍然......

于 2012-05-14T17:28:37.020 回答