如果一个类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/