安置新的地址对齐



根据https://isocpp.org/wiki/faq/dtors#placement-new将地址传递到安置新的时期必须正确对齐。但是它给出的例子似乎与之矛盾。

char memory[sizeof(Fred)];

此缓冲区很可能是不是对FRED的对齐,因为它是一个愚蠢的char[],因此memory可以在任何地方指向任何地方。然后它在此地址上进行安置。

是与它在 danger 脚注中所说的对齐要求相矛盾的示例?

导致一个相关问题:

如何为对齐用于类型的 T(用于一个或多个t对象的位置新闻)?

>

由缓冲区我是指某种大小的char[]void*缓冲液,而不是T[],因为这将是对象分配,这会破坏后来进行放置的点。

谢谢。

使用alignas关键字:

alignas(Fred) char buf[sizeof(Fred)];
::new (static_cast<void*>(buf)) Fred;

或使用std::aligned_storage,如果您喜欢此结构周围的库包装。

关于您的第一个问题:根据此相关问题的答案是的,示例弄错了:

静态分配的数组与sizeof(element_type)字节对齐 - 对于char是1个字节,基本上可以保证任何一致。

因此,阵列char memory[sizeof(Fred)]不能保证Fred

正确的做法是如下(C 11):

alignas(Fred) char memory[sizeof(Fred)];

用于堆的分配,只需使用std::malloc,它可以保证为任何类型分配对齐的内存。

对于堆栈分配,如果您可以访问C 11,则可以使用

中的alignas
alignas(T) uint8_t data[sizeof(T)];

如果您无法访问C 11,则必须作为GCC的__attribute__((aligned(N)))

最新更新