通过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表示可能支持扩展对齐,因此编译器可能自己决定类是否是过度对齐类型?
答案 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 :
具有扩展对齐要求的类型是过度对齐类型。 [ 注意: 每个过度对齐的类型是或包含扩展对齐适用的类类型(可能通过非静态数据成员)。 - 后注]
这似乎意味着必须明确要求扩展对齐(然后传播)但不能
我希望更明确一点;对于编译器 - 编写者来说,意图是显而易见的,任何其他行为都会是疯狂的,仍然......