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

edA*_*a-y 57 c++ language-lawyer c++11

通过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表示可能支持扩展对齐,编译器可能自己决定一个类是一个过度对齐的类型?

Jam*_*nze 18

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

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

  • 它只需要为具有基本对齐要求的类型提供对齐,最多为"max_align_t".所以问题是编译器是否可以创建扩展对齐的类类型,因此不会从根本上对齐. (2认同)

Mat*_* M. 6

我所缺少的是所说的位alignof(T)总是有效的对齐,最大值为max_align_t.我的意思是,这似乎是显而易见的,但结构的最终对齐必须至多max_align_t吗?即使点3.11-3表示可能支持扩展对齐,编译器可能自己决定一个类是一个过度对齐的类型?

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

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

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

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