假设我们有一些有效的类型T.给出以下代码:
char* p = static_cast<char*>(malloc(sizeof(T) * 32));
T* t1 = new (p) T;
p += sizeof(T);
T* t2 = new (p) T;
...
现在t2
是否可以根据其对齐限制无法正确对齐?
答案 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单位。