的新字符实际上保证类类型的对齐的内存吗?

通过alignof(T)分配的缓冲区保证可以分配为max_align_t类型正确对齐的内存,其中max_align_t的所有成员都具有其自然的,实现的定义的对齐方式(也就是说,您没有使用alignas关键字来修改其对齐方式)。

我已经在这里找到了一些答案,但并不清楚标准如何达到此保证。 标准的5.3.4-10给出了基本要求:本质上必须将alignof(T)对准max_align_t

我所缺少的是说alignof(T)将始终是有效的对齐方式,最大值为max_align_t。我的意思是,这似乎很明显,但是结构的对齐方式最多不能超过max_align_t吗? 即使是第3.11-3点,也可以支持扩展的对齐方式,那么编译器是否可以自行决定类是否为过度对齐的类型?

edA-qa mort-ora-y asked 2019-11-08T03:50:33Z
2个解决方案
18 votes

确保表达式operator new(N)new unsigned char[N]返回足以对齐任何对象的内存。 参见§5.3.4/ 10“ [...]对于char和unsigned char数组,new表达式的结果和分配返回的地址功能应是最严格基础的整数倍尺寸不大于任何对象类型的对齐要求(3.11)比正在创建的数组的大小。 [注意:因为分配假定函数返回指向存储的指针,即适用于具有基本特征的任何类型的对象对齐方式,这种对数组分配开销的约束允许将字符数组分配给其他对象的常见习语类型将在以后放置。 —尾注]”。

当然,从样式角度来看:如果要分配原始数据记忆,更清楚地说是:operator new(N)。从概念上讲,new char[N]创建N char; operator new(N)分配N字节。

James Kanze answered 2019-11-08T03:51:53Z
6 votes

我所缺少的是说alignof(T)将始终是有效的对齐方式,最大值为max_align_t。我的意思是,这似乎很明显,但是结构的对齐方式最多不能超过max_align_t吗? 即使是第3.11-3点,也可以支持扩展的对齐方式,那么编译器是否可以自行决定类是否为过度对齐的类型?

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

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

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

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

Matthieu M. answered 2019-11-08T03:51:18Z
translate from https://stackoverflow.com:/questions/10587879/does-new-char-actually-guarantee-aligned-memory-for-a-class-type