对托管对象执行std :: optional和boost :: optional尊重对齐限制吗?

pat*_*gan 1 c++ boost boost-optional c++17 stdoptional

如果一个类T具有对齐要求,例如由alignas关键字指定的对齐要求,std::optional<T>并且boost::optional<T>保证尊重所述对齐?

如果它们只是T对象和a的包装类bool initialized,那么它们会T根据需要自动对齐它们的成员,但标准和boost文档声明它们不能容纳任何对象并且很好地处理昂贵的构造对象.据我所知,他们不仅仅包含一个T.相反,它们似乎分配了一个缓冲区,T手动构造或销毁它.因此,C++语言不会自动对齐缓冲区,因为它不是类型T.

那么,做std::optional<T>boost::optional<T>正确对齐他们的托管T对象?他们是否也提供optional<T>::operator newoptional<T>::operator new[]尊重对齐要求?

Pau*_*ulR 5

符合std :: optional的实现必须遵守value_typeC++ 17标准草案的对齐要求:

23.6.3类模板可选[optional.optional]

(...)所包含的值应分配在可选存储区域中,适合于类型T对齐.

实现者可以使用可能包含值作为成员的联合,从而确保正确对齐.

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