c++ - std::optional 和 boost::optional 是否遵守托管对象的对齐限制?

标签 c++ boost c++17 boost-optional stdoptional

如果一个类T有对齐要求,例如 alignas 指定的要求关键字,是 std::optional<T>boost::optional<T>保证尊重上述对齐方式?

如果它们只是 T 的包装类对象和一个 bool initialized , 然后他们会自动对齐他们的 T成员根据需要,但标准和 boost 文档声明它们不能容纳任何对象并且可以很好地处理构建对象的昂贵问题。据此我了解到它们不仅仅包含 T .相反,他们似乎分配了一个缓冲区,T是人工 build 或销毁的。因此,C++ 语言不会自动对齐缓冲区,因为它不是 T 类型。 .

所以,做 std::optional<T>boost::optional<T>正确对齐他们的托管 T目的?他们也提供optional<T>::operator new吗?和 optional<T>::operator new[]尊重对齐要求?

最佳答案

符合标准的 std::optional 实现必须遵守其 value_type 的对齐要求根据 C++17 标准草案:

23.6.3 Class template optional [optional.optional]

(...) The contained value shall be allocated in a region of the optional storage suitably aligned for the type T.

实现者可以使用可能包含值作为成员的 union ,以确保正确对齐。

正如 Thomas 在我查找时提到的那样,boost::optional 确实通过使用 aligned_storage<T> 来确保正确对齐。

关于c++ - std::optional 和 boost::optional 是否遵守托管对象的对齐限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46038378/

相关文章:

c++ - spirit boost : copy the result in a vector of strings

c++ - 按字符数拆分字符串的 spirit 语法

c++ - 为什么 INVOKE 总是取消引用数据成员而不是尽可能调用?

c++ - 自动模板推导中的常量正确性

c++ - clang 3.9、auto_ptr 和 boost

c++ - 如何让 std::getline 在到达字符串流的末尾时通知我?

c++ - std::codecvt_utf8 方面的问题

c++ - 主函数中的 "WINAPI"是什么意思?

multithreading - boost:thread - 编译器错误

c++ - 使用 boost::array 中的 std::string::assign 与 std::array 的不兼容性