标准库分配器指针类型的要求

时间:2011-03-25 15:41:04

标签: c++ standard-library allocator language-lawyer

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

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

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

我当然会使用两个不同的分配器:这是可以的,因为分配器类型提供rebind模板和模板复制构造函数(并且旨在用作值类型,如{{1}标准容器的成员建议通过返回副本)。

问题是分配器成员函数使用某种get_allocator类型,它不需要是一个vanilla指针。一些分配器(boost进程间分配器)广泛使用此功能。

如果分配器指针类型是花园种类指针,我就没有问题:至少,我可以使用指针void并将它们重新解释为正确的类型(pointernode* )。我也可以使用联盟(可能更好)。

据我所知,T*类型的POD没有要求。它们只需要是随机访问迭代器。

现在,我的问题是:

鉴于分配器类模板allocator::pointer(或其等效的A<T>),是否有任何保证:

  1. A::rebind<T>::other提供A<T>::pointer静态广告A<U>::pointer的能力是U的可访问基础?
  2. T静态转换为A<T>::pointer提供A<U>::pointer的能力是T和“运行时类型”的可访问基础(无论这意味着什么) castee的上下文是U
  3. 类型U(如果这样做有意义)?
  4. 或者我的问题是否有解决方案我没想过?

3 个答案:

答案 0 :(得分:2)

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

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

  

typedef成员指针,   const_pointer,size_type和   difference_type必须是   T *,T const *,size_t和ptrdiff_t,   分别

答案 1 :(得分:0)

不,不是真的。

要求A&lt; T&gt; ::指针可转换为A&lt; T&gt; :: const_pointer和A&lt; T&gt; :: void_pointer,但这是我能找到的所有内容。

&lt; void&gt; ::指针很可能是void*,除非你有一些奇特的特殊记忆。

答案 2 :(得分:0)

请注意,即使union可用,我仍然不会使用,特别是因为在这里您可能会受益于某种形式的自动内存管理(为了让您的包含不泄漏),这需要花哨的课程。

因此,我建议采用两步法:

  • 编写一个使用给定分配器执行销毁的小型智能指针(而不是delete
  • 在指针上使用boost::variant

通过这种方式,您可以同时拥有自动内存管理兼容性