根据https://isocpp.org/wiki/faq/dtors#placement-new 传递给placement-new的地址必须正确对齐。但它给出的例子似乎与此相矛盾。
char memory[sizeof(Fred)];
这个缓冲区很可能不与 Fred 对齐,因为它是一个愚蠢的 char[]
,所以 memory
几乎可以指向任何地方.然后在这个地址上做placement-new。
该示例是否与 DANGER 脚注中所说的对齐要求相矛盾?
这就引出了一个相关的问题:
如何为类型 T
创建一个 对齐 的缓冲区(堆栈或堆)(用于一个或多个 T 对象的placement-new) ?
缓冲区是指某种大小的 char[]
或 void*
缓冲区,而不是 T[]
因为那将是对象分配,这破坏了事后做placement-new的意义。
谢谢。
最佳答案
使用 alignas
关键字:
alignas(Fred) char buf[sizeof(Fred)];
::new (static_cast<void*>(buf)) Fred;
如果您更喜欢围绕此构造的库包装器,请使用 std::aligned_storage
。
关于c++ - 放置-新地址对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42521605/