联合而不是aligned_storage_t作为容器节点类型的一部分
union instead of aligned_storage_t as part of node type of container
容器std::list< T >/std::map< T >/std::set< T >
(不是完整列表)来存储元素使用节点类型,这与T
不同,与std::vector
或std::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
更符合人体工程学。
- 反向给定链表中的K节点
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- Boost Graph Library,修复节点大小
- C++A*算法并不总是在路径中具有目标节点
- 如何找到2个单链表的公共节点
- C++:如何使函数只返回作为列表一部分的字符串
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 为什么我的删除节点函数实际上没有删除节点?
- std::sort()函数无法对向量的一部分进行排序
- 我们可以删除链表中静态内存中的节点吗
- 如何在pugixml中获取节点的内部XML
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- 节点 *temp; 和节点 *tmp = 新节点之间的差异
- 引擎节点:未定义的符号:_ZTV6Config
- 联合而不是aligned_storage_t作为容器节点类型的一部分
- 是被视为列表一部分的单链列表的根节点
- 链表:在给节点的下一部分赋值时出现分段错误