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

Is it possible to allocate misaligned objects in the following case?

本文关键字:对齐 对象 分配 情况下 是否      更新时间:2023-10-16

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

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

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

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

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

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

p += sizeof(T);

将指针按大小 (T) 单位而不是 1 前进。"++p;"将给出下一个 T 单位。