在下列情况下是否可以分配未对齐的对象?

时间:2018-01-19 17:21:47

标签: c++

假设我们有一些有效的类型T.给出以下代码:

char* p = static_cast<char*>(malloc(sizeof(T) * 32));
T* t1 = new (p) T;
p += sizeof(T);
T* t2 = new (p) T;
...

现在t2是否可以根据其对齐限制无法正确对齐?

2 个答案:

答案 0 :(得分:2)

取决于T是什么。保证与将指针直接存储到T*中的保证相同。如果指针P与N字节边界对齐,则P + N也与N对齐。此外,大小必须是对齐的倍数。 malloc内存保证与max_align_t的对齐方式保持一致。

如果指针是 over aligned 类型,即对齐要求高于T的类型,则不保证指针与max_align_t对齐。

答案 1 :(得分:0)

它将被正确对齐,但请注意,指针算法是以类型大小的倍数完成的,所以

p += sizeof(T);

将使用sizeof(T)单位而不是1来推进指针。“++ p;”会给下一个T单位。