【发布时间】:2021-04-24 20:36:58
【问题描述】:
鉴于其他未知类型的对齐方式和大小,如何安全地构造正确对齐的空闲存储(堆)?
对于上下文:自动存储版本有据可查。请参阅https://en.cppreference.com/w/cpp/types/aligned_storage 的示例:堆栈上的不透明未初始化存储得到正确对齐,一旦类型已知,以后可以放置新的。
是否可以类似地在堆上进行对齐安全的未初始化分配?一旦类型已知(并在类型感知上下文中通过适当的销毁等删除),此存储稍后将被初始化放置。
以下天真的尝试失败:https://godbolt.org/z/PM1xWoYox
堆存储的心智模型是什么?
【问题讨论】:
-
std::aligned_storage只是一个类型。是什么阻止您将其分配到堆而不是堆栈上? -
好问题:(a) sz 和 align 是运行时值。 (b) 好奇如何正确使用 (sz, align) 运算符 new 和 delete 的重载。例如,即使将 align 参数提供为
__STDCPP_DEFAULT_NEW_ALIGNMENT__,当 new(sz,align) 与类型化删除(不带对齐)配对时,明显的行为也是不正确的。 -
您是否尝试过分两步删除,因为您也分两步执行了新操作?
标签: c++ memory c++17 memory-alignment