根据https://isocpp.org/wiki/faq/dtors#placement-new的说法,传递到新位置的地址必须正确地对齐。但它给出的例子似乎与此相矛盾。
char memory[sizeof(Fred)];这个缓冲区很可能是,而不是,因为它是一个愚蠢的char[],所以memory可以指向几乎任何地方。在这个地址上有新的位置。
是一个与它在“脚注?”中所说的对齐要求相矛盾的例子。
这就引出了一个相关问题:
如何创建缓冲区(堆栈或堆),即对齐的类型T (用于放置-一个或多个T对象的新的)?
所谓缓冲区,我指的是一定大小的char[]或void*缓冲区,而不是T[],因为这将是一个对象分配,这将使执行布局的目的失败--之后才是新的。
谢谢。
发布于 2017-03-01 01:24:54
使用alignas关键字:
alignas(Fred) char buf[sizeof(Fred)];
::new (static_cast<void*>(buf)) Fred;或者使用std::aligned_storage,如果您喜欢这个构造的库包装器。
发布于 2017-03-01 01:33:17
关于你的第一个问题:根据answers to this related question是的,这个例子错了:
静态分配的数组对齐大小(Element_type)字节--对于char来说是1字节,这基本上不保证对齐。
因此,数组char memory[sizeof(Fred)]没有对Fred的对齐保证。
正确的方法如下(C++11):
alignas(Fred) char memory[sizeof(Fred)];发布于 2017-03-01 01:29:07
对于堆分配,只需使用std::malloc,它保证为任何类型分配对齐的内存。
对于堆栈分配,如果您可以访问C++11,则可以使用alignas,如下所示
alignas(T) uint8_t data[sizeof(T)];如果您没有访问C++11的权限,那么就必须回到GCC的__attribute__((aligned(N)))那样的特定编译器属性。
https://stackoverflow.com/questions/42521605
复制相似问题