gpt4 book ai didi

c++ - 对标准库分配器指针类型的要求

转载 作者:可可西里 更新时间:2023-11-01 17:58:59 27 4
gpt4 key购买 nike

我正在尝试编写一个四叉树稀疏矩阵类。简而言之,一个 quadtree_matrix<T>是零矩阵或四元组 (ne, nw, se, sw)quadtree_matrix<T> .

我最终想测试不同的分配方案,因为这可能会影响线性代数运算的性能。所以我也会模板quadtree_matrix在标准分配器类型上,以便我可以重用现有的分配器。

我将不得不分配两种不同类型的数据:T , 或 node ,其中包含四个指针(指向 T 或节点)。对于我将考虑的所有算法,我肯定知道期望什么样的数据,因为我知道在算法的任何一点我所面对的子矩阵的大小是多少(我什至不需要存储这些大小)。

我当然会使用两个不同的分配器:这没关系,因为分配器类型提供了 rebind模板和模板复制构造函数(并且旨在用作值类型,正如标准容器的 get_allocator 成员通过返回拷贝所建议的那样)。

问题是分配器成员函数使用某个 pointer类型,不需要是 Vanilla 指针。一些分配器(提升进程间分配器)广泛使用此功能。

如果分配器指针类型是普通指针,我不会有任何问题:至少,我可以使用指向 void 的指针并将它们重新解释为正确的类型(node*T* )。我也可以使用 union (可能更好)。

据我所知,对allocator::pointer的PODn​​ess没有要求。类型。它们只需要是随机访问迭代器。

现在,我的问题是:

给定一个分配器类模板 A<T> (或等效的 A::rebind<T>::other ),是否有任何保证:

  1. 静态转换能力A<T>::pointerA<U>::pointer提供UT 的可访问基础?
  2. 静态转换能力A<T>::pointerA<U>::pointer提供TU 的可访问基础castee 的“运行时类型”(无论在本文中是什么意思)是 U ?
  3. 类型A<void>::pointer (如果这有意义)?

或者是否有我没有想到的问题的解决方案?

最佳答案

从 20.1.5/2 中的表格可以清楚地看出 A<T>::pointer 的类型必须是“指向 T 的指针”。由于这些指针类型通常是可转换的,因此您的 1 和 2 是正确的。接下来是A<void>::pointer必须是 void* .

编辑:20.1.5/4 中也有明确的措辞(它适用于标准容器对分配器的假设):

The typedef members pointer, const_pointer, size_type, and difference_type are required to be T*,T const*, size_t, and ptrdiff_t, respectively.

关于c++ - 对标准库分配器指针类型的要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5434737/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com