c++ - 放置-新地址对齐

标签 c++ memory-management undefined-behavior memory-alignment

根据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/

相关文章:

c++ - 在另一个输入请求之前清除 cin 缓冲区,c++

c++ - 内联函数,内部类,C++

c++ - Cereal 二进制文件序列化/反序列化

c - 没有返回类型的 C 函数的未定义行为

C++/函数中的引用

c++ - 如何找出我的 Linux 应用程序的内存占用情况?

c - 在调用之前确定 realloc() 行为

c - free() 然后再 malloc()

c++ - 具有数据成员语法的零成本属性

c++ - 使用 copy 和 back_inserter 将 vector 附加到自身时的错误结果