给定一个自定义向量并使用std::allocator进行分配,在C++17及以上版本下,我们仍然需要使用alignas创建一个内部过度对齐类型OT,然后为OT分配,并在解引用之前将OT*重新转换为T*迭代器运算符*上的指针,以支持类型的过度对齐?
或者 std::allocator 是否正确对齐,并且取消引用 T* 是否能够完美地返回对元素的正确过度对齐引用?
感谢您的任何澄清。
在 C++17 之前,
std::allocator
是否支持过度对齐类型是由实现定义的。
对于 C++17 的P0035,这一点已更改,现在需要支持所有类型。一般来说,实现支持类型的对齐方式仍然是实现定义的,但您无法首先定义具有不支持的对齐方式的类型。
因此,即使在 C++17 中过度对齐,
std::vector<T>
也会正确对齐类型 T
的元素。
但是,Allocator 要求通常不要求支持所有过度对齐,不幸的是允许对齐被默默地忽略。因此,如果您使用与
std::allocator
不同的分配器,则必须单独验证它是否支持过度对齐类型的对齐。