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

问题描述 投票:0回答:1

给定一个自定义向量并使用std::allocator进行分配,在C++17及以上版本下,我们仍然需要使用alignas创建一个内部过度对齐类型OT,然后为OT分配,并在解引用之前将OT*重新转换为T*迭代器运算符*上的指针,以支持类型的过度对齐?

或者 std::allocator 是否正确对齐,并且取消引用 T* 是否能够完美地返回对元素的正确过度对齐引用?

感谢您的任何澄清。

c++ types c++17 allocator overaligned
1个回答
1
投票

在 C++17 之前,

std::allocator
是否支持过度对齐类型是由实现定义的。

对于 C++17 的P0035,这一点已更改,现在需要支持所有类型。一般来说,实现支持类型的对齐方式仍然是实现定义的,但您无法首先定义具有不支持的对齐方式的类型。

因此,即使在 C++17 中过度对齐,

std::vector<T>
也会正确对齐类型
T
的元素。

但是,Allocator 要求通常不要求支持所有过度对齐,不幸的是允许对齐被默默地忽略。因此,如果您使用与

std::allocator
不同的分配器,则必须单独验证它是否支持过度对齐类型的对齐。

© www.soinside.com 2019 - 2024. All rights reserved.