新char实际上是否保证类类型的对齐内存?

时间:2012-05-14 17:03:16

标签: c++ c++11 language-lawyer

通过new char[sizeof(T)]分配缓冲区保证分配内存,该内存已正确对齐T类型,其中T的所有成员都具有其自然的,实现定义的对齐方式(即,您尚未使用alignas关键字修改其对齐方式。)

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

我缺少的是alignof(T)始终是有效对齐的位,其最大值为max_align_t。我的意思是,这似乎很明显,但结构的最终对齐必须至多max_align_t?甚至点3.11-3表示可能支持扩展对齐,因此编译器可能自己决定类是否是过度对齐类型?

2 个答案:

答案 0 :(得分:17)

保证表达式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 char; operator new(N)分配N个字节。

答案 1 :(得分:6)

  

我缺少的是alignof(T)始终是有效对齐的位,其最大值为max_align_t。我的意思是,这似乎很明显,但结构的最终对齐必须至多max_align_t?甚至点3.11-3表示可能支持扩展对齐,因此编译器可能自己决定类是否是过度对齐类型?

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

  

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

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

我希望更明确一点;对于编译器 - 编写者来说,意图是显而易见的,任何其他行为都会是疯狂的,仍然......