通过 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 点说可能支持扩展对齐,所以编译器可以自己决定一个类是过度对齐的类型吗?
最佳答案
保证表达式 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
个字节。
关于c++ - new char 实际上是否保证了类类型的对齐内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10587879/