联合而不是aligned_storage_t作为容器节点类型的一部分

union instead of aligned_storage_t as part of node type of container

本文关键字:节点 一部分 类型 storage aligned      更新时间:2023-10-16

容器std::list< T >/std::map< T >/std::set< T >(不是完整列表)来存储元素使用节点类型,这与T不同,与std::vectorstd::array相反。

如果我将一些分配器A传递给他们,那么它将通过以下方式"转换"为node_allocator_type

using allocator_traits = typename std::allocator_traits< A >::template rebind_traits< node_type >;
using node_allocator_type = typename allocator_traits::allocator_type;

标准库实现(libc++,libstdc++)可以使用std::aligned_storage_t< sizeof(T), alignof(T) >的类似物作为节点类型的组成部分,作为存储类型T值的位置。"超过结尾"或"根"元素可能没有存储类型T的值。值的生命周期由容器"手动"管理,方法是使用就地::operator new和最后手动调用析构函数。

在表单中使用单元素union是否有效

union U
{
U() { ; }
T value;
};

而不是std::aligned_storage_t< sizeof(T), alignof(T) >

std::aligned_storage_t的哪些属性(内部可以实现为正确对齐的char [sizeof(T)];类型数组)在上述用例中至关重要,并优先于上述union的所有潜在优势?

首先,更接近的类比实际上是:

union U
{
U() { }
~U() { }
T value;
};

以防T不是微不足道的可破坏的。

也就是说,当您需要文字类型时,union将是必需的。不能在constexpr构造函数中使用 placement-new,所以这是开始的。这是朝这个方向取得的巨大胜利。

aligned_storage_t的一个优点是您无需担心T过载operator&()的可能性。new (&u.value) T可能会做一些奇怪的事情,并且可能根本不编译。new (&storage) T没有这个问题,同时比new (std::addressof(u.value)) T更符合人体工程学。