根据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)))
。