met*_*sis 0 c++ types allocator c++17 overaligned
给定一个自定义向量并使用 std::allocator 进行分配,在 C++17 及更高版本下,我们仍然需要使用alignas创建内部过度对齐类型OT,然后为OT分配,并在取消引用指针之前将reinterpret_cast OT* 转换为T*在迭代器运算符*上,为了支持类型的过度对齐?
或者 std::allocator 是否正确对齐,并且取消引用 T* 是否可以完美地返回对元素的正确过度对齐引用?
感谢您的任何澄清。
std::allocator在 C++17 之前,是否支持过度对齐类型是由实现定义的。
对于C++17 的P0035,这种情况发生了变化,现在需要支持所有类型。一般来说,实现支持类型的对齐方式仍然是实现定义的,但您无法首先定义具有不受支持的对齐方式的类型。
因此,即使 a 在 C++17 中过度对齐,std::vector<T>也会正确对齐其元素的类型。T我不遵循您对实现对齐的“旧”方法的解释,但在 C++17 之前,如果没有提到的实现定义,就无法使用std::vector标准Allocator将过度对齐的类型放入 a 中。您必须编写自己的分配器来支持过度对齐的类型。您也始终需要并且仍然需要alignas实际使您的类型T过度对齐。
然而,分配器要求通常不要求支持所有过度对齐,不幸的是允许对齐被默默地忽略。因此,如果您使用与 不同的分配器std::allocator,则必须单独验证它是否支持过度对齐类型的对齐。