如果C++17及更高版本保证分配器必须支持过对齐类型,这是否意味着我们可以避免创建手动对齐类型?

gorkyyrv  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(108)

给定一个自定义vector并使用std::allocator进行分配,在C++17及更高版本下,我们是否仍然需要使用alignas创建一个内部overaligned类型OT,然后为OT分配,并在解引用迭代器operator* 上的指针之前将OT* 重新解释_cast为T*,以支持类型的overalignment?
或者std::allocator是否正确对齐,并且解引用T* 是否可以完美地返回对元素的正确过对齐引用?
感谢您的任何澄清。

fivyi3re

fivyi3re1#

在C17之前,std::allocator是否支持过对齐类型是由实现定义的。
P0035 for C
17中,这一点被改变了,现在所有类型都需要被支持。一个实现支持的类型对齐通常仍然是实现定义的,但是你不能首先定义一个不支持对齐的类型。
因此,std::vector<T>将正确对齐其类型T的元素,即使它在C17中过度对齐。我不明白你对实现对齐的“旧”方法的解释,但在C17之前,没有提到的实现定义,没有办法用标准的 Allocator 将过度对齐的类型放入std::vector中。您必须编写自己的 Allocator 来支持过度对齐。对齐类型。你也总是需要并且仍然需要alignas来实际使你的类型T过对齐。
然而,Allocator 的要求通常不要求支持所有的过度对齐,不幸的是,它允许对齐被忽略。因此,如果你使用的分配器不同于std::allocator,你必须单独验证它是否支持你的过度对齐类型的对齐。

相关问题