安置新的地址对齐
Placement-new address alignment
根据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)))
。
相关文章:
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 内存地址是否由于未对齐的内存地址而损坏?
- 计算以前对齐的地址
- 对象地址是否保证是其类型对齐的倍数
- 数据对齐:限制内存地址为数据类型大小倍数的原因
- 安置新的地址对齐
- 在 C/C++ 中在特定地址边界上对齐内存是否仍能提高 x86 性能?
- 将地址向前对齐
- 编译器如何知道物理地址的对齐方式
- x86-64上检查指针范围是否跨越N字节对齐地址的最快方法
- MOVAPS 访问未对齐的地址
- CUDA 在推力device_vector调整大小时地址未对齐
- 做 malloc 和 new 返回一个 int 对齐的地址
- 内存地址的数字表示和对齐之间的关系
- 如何将地址对齐到一个void指针
- 为什么数据断点不能在未对齐的地址上工作
- 如何确定地址是否与缓存对齐
- C++变量地址和对齐方式 |x86
- 查找下一个对齐的内存地址