【发布时间】:2018-02-12 18:28:56
【问题描述】:
如果类T 有对齐要求,例如由alignas 关键字指定的,那么std::optional<T> 和boost::optional<T> 是否保证遵守所述对齐?
如果它们只是 T 对象和 bool initialized 的包装类,那么它们将根据需要自动对齐其 T 成员,但标准和 boost 文档声明它们可以不保存任何对象并且处理得很好构造对象的成本很高。据我了解,它们不仅仅包含T。相反,他们似乎分配了一个缓冲区,T 在该缓冲区上手动构建或销毁。因此,C++ 语言不会自动对齐缓冲区,因为它不是T 类型。
那么,std::optional<T> 和 boost::optional<T> 是否正确对齐其托管的 T 对象?他们是否还提供尊重对齐要求的optional<T>::operator new 和optional<T>::operator new[]?
【问题讨论】:
-
............是的。
-
答案不是显然是吗?我无法想象一个不尊重模板类型对齐的完整实现。
-
他们为什么要提供
operator new? -
因为表达式
new std::optional<T>不受T或std::optional<T>的alignas说明符的影响。
标签: c++ boost c++17 boost-optional stdoptional