给定一个自定义vector并使用std::allocator进行分配,在C++17及更高版本下,我们是否仍然需要使用alignas创建一个内部overaligned类型OT,然后为OT分配,并在解引用迭代器operator* 上的指针之前将OT* 重新解释_cast为T*,以支持类型的overalignment?或者std::allocator是否正确对齐,并且解引用T* 是否可以完美地返回对元素的正确过对齐引用?感谢您的任何澄清。
fivyi3re1#
在C17之前,std::allocator是否支持过对齐类型是由实现定义的。在P0035 for C17中,这一点被改变了,现在所有类型都需要被支持。一个实现支持的类型对齐通常仍然是实现定义的,但是你不能首先定义一个不支持对齐的类型。因此,std::vector<T>将正确对齐其类型T的元素,即使它在C17中过度对齐。我不明白你对实现对齐的“旧”方法的解释,但在C17之前,没有提到的实现定义,没有办法用标准的 Allocator 将过度对齐的类型放入std::vector中。您必须编写自己的 Allocator 来支持过度对齐。对齐类型。你也总是需要并且仍然需要alignas来实际使你的类型T过对齐。然而,Allocator 的要求通常不要求支持所有的过度对齐,不幸的是,它允许对齐被忽略。因此,如果你使用的分配器不同于std::allocator,你必须单独验证它是否支持你的过度对齐类型的对齐。
std::allocator
std::vector<T>
T
std::vector
alignas
1条答案
按热度按时间fivyi3re1#
在C17之前,
std::allocator
是否支持过对齐类型是由实现定义的。在P0035 for C17中,这一点被改变了,现在所有类型都需要被支持。一个实现支持的类型对齐通常仍然是实现定义的,但是你不能首先定义一个不支持对齐的类型。
因此,
std::vector<T>
将正确对齐其类型T
的元素,即使它在C17中过度对齐。我不明白你对实现对齐的“旧”方法的解释,但在C17之前,没有提到的实现定义,没有办法用标准的 Allocator 将过度对齐的类型放入std::vector
中。您必须编写自己的 Allocator 来支持过度对齐。对齐类型。你也总是需要并且仍然需要alignas
来实际使你的类型T
过对齐。然而,Allocator 的要求通常不要求支持所有的过度对齐,不幸的是,它允许对齐被忽略。因此,如果你使用的分配器不同于
std::allocator
,你必须单独验证它是否支持你的过度对齐类型的对齐。