新的字符实际上保证alignment的内存类types?
通过new char[sizeof(T)]
分配一个缓冲区,保证为T
types正确地分配内存,其中T
所有成员都有自然的,实现定义的alignment方式(也就是说,你还没有使用alignas
关键字修改它们的alignment)。
我在这里看到了几个答案中的这个保证,但是我不完全清楚标准是如何得到这个保证的。 该标准的5.3.4-10给出了基本要求:基本上new char[]
必须与max_align_t
alignment。
我所缺less的是说, alignof(T)
将始终是一个有效的队列,最大值为max_align_t
。 我的意思是,这似乎很明显,但一个结构的结果alignment最多是max_align_t
? 甚至连点3.11-3都说可以支持扩展alignment,所以编译器可以自己决定一个类是否是一个过度alignment的types?
我所缺less的是说,
alignof(T)
将始终是一个有效的队列,最大值为max_align_t
。 我的意思是,这似乎很明显,但一个结构的结果alignment最多是max_align_t
? 甚至连点3.11-3都说可以支持扩展alignment,所以编译器可以自己决定一个类是否过度alignment?
正如Mankarse所指出的,我能得到的最好的报价是从[basic.align] / 3 :
具有扩展的alignment要求的types是超alignmenttypes。 [注意:每个超alignmenttypes是或包含扩展alignment应用的类types(可能通过非静态数据成员)。 – 注意]
这似乎意味着扩展alignment必须明确要求(然后传播),但不能
我希望更清楚一点, 对于编译器编写者来说这个意图是显而易见的,任何其他的行为都是疯狂的,但是…
expression式new char[N]
和new unsigned char[N]
保证返回足够alignment任何对象的内存。 参见§5.3.4/ 10“[…]对于char和unsigned char的数组,新expression式的结果与分配函数返回的地址之间的差异应该是最严格的基本alignment要求的整数倍(3.11),其大小不超过所创build的数组的大小[注意:因为分配函数被假定为返回指向存储的指针,这些指针对于任何具有基本alignment的types的对象都适当地alignment,数组分配开销允许分配其他types的对象稍后将被放置到的字符数组的普通习惯用法。
当然,从文体的angular度来看,如果你想要的是分配原始内存,则更清楚地说: operator new(N)
。 从概念上讲, new char[N]
创buildN
char
; operator new(N)
分配N
个字节。