【问题标题】:Requirements on standard library allocator pointer types标准库分配器指针类型的要求
【发布时间】:2011-03-25 15:41:04
【问题描述】:

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

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

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

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

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

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

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

现在,我的问题是:

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

  1. A<T>::pointer 静态转换为A<U>::pointer 的能力提供UT 的可访问基础?
  2. A<T>::pointer 静态转换为A<U>::pointer 的能力提供TU 的可访问基础,并且被种姓的“运行时类型”(无论在此上下文中是什么意思)是@987654343 @ ?
  3. A<void>::pointer 类型(如果有意义的话)?

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

【问题讨论】:

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


    【解决方案1】:

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

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

    typedef 成员指针, const_pointer、size_type 和 差异类型必须是 T*、T const*、size_t 和 ptrdiff_t, 分别。

    【讨论】:

    • 所以没有花哨的内存分配器空间? Boost 进程间共享内存分配器返回 offset_ptr<T> 类型,它不是 T* 而是随机迭代器。
    • @Alexandre:我相信在 boost 文档中,他们实际上将此作为 boost 进程间不能提供标准分配器以及为什么他们需要自定义容器的原因之一。
    • 好的,所以我假设它们是真正的指针。我担心的是第三方分配器类可能不使用真正的指针类型作为pointer。由于允许标准容器类假设这一点,那么我会这样做。谢谢你的回答!
    【解决方案2】:

    不,不是。

    要求 A::pointer 可以转换为 A::const_pointer 和 A::void_pointer 但这就是我能找到的所有内容。

    A::pointer 很可能是void*,除非你有一些花哨的特殊内存。

    【讨论】:

      【解决方案3】:

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

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

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

      这样您就拥有自动内存管理紧凑性

      【讨论】:

      • 我不希望 boost 变体的运行时安全(它添加了一个标志),也不希望在每个指针旁边引用分配器。这会增加 each 节点的开销(这意味着 6n 开销而不是 4n 开销,其中 n = 非零条目的数量)。我可以很好地(如果我不想在头顶上没有空间的话,实际上是必须的)手动破坏容器。
      • 确实,我没有指定这一点。我想将四叉树方案与“传统”稀疏矩阵算法进行比较。类本身很容易使用,但它的实现却不行。
      • @Alexandre C:我明白 :) 这是你的努力:p
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-28
      • 1970-01-01
      • 2019-08-28
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      相关资源
      最近更新 更多