【问题标题】:C++ STL allocator vs operator newC++ STL 分配器与运算符 new
【发布时间】:2011-08-03 10:31:49
【问题描述】:

根据 C++ Primer 4th edition, page 755,有一条注释说:

现代 C++ 程序通常应该使用分配器类 分配内存。它更安全,更灵活。

我不太明白这个说法。 到目前为止,我阅读的所有材料都使用 new 在 C++ 中分配内存。 书中展示了向量类如何利用分配器的示例。 但是,我想不出其他场景。

谁能帮助澄清这个声明?并给我更多的例子? 什么时候应该使用分配器,什么时候应该使用new?谢谢!

【问题讨论】:

    标签: c++ memory stl new-operator allocator


    【解决方案1】:

    对于一般编程,是的,您应该使用 newdelete

    但是,如果您正在编写库,则不应该! 我没有你的教科书,但我想它是在编写库代码的上下文中讨论分配器。

    库的用户可能希望准确控制从何处分配的内容。如果库的所有分配都通过newdelete,用户将无法获得如此细粒度的控制。

    所有 STL 容器都采用可选的分配器模板参数。然后容器将使用该分配器来满足其内部内存需求。默认情况下,如果您省略分配器,它将使用std::allocator,后者使用newdelete(特别是::operator new(size_t)::operator delete(void*))。

    这样,该容器的用户可以根据需要控制从哪里分配内存。

    实现与 STL 一起使用的自定义分配器的示例和说明:Improving Performance with Custom Pool Allocators for STL

    旁注:分配器的 STL 方法在几个方面都不是最佳的。我建议阅读 Towards a Better Allocator Model 以讨论其中的一些问题。

    2019 年编辑: 自编写此答案以来,C++ 的情况有所改善。有状态分配器在 C++11 中是 supported,并且在 C++17 中改进了这种支持。参与“迈向更好的分配器模型”的一些人参与了这些更改(例如:N2387),这很好(:

    【讨论】:

    • +1 表示“分配器的 STL 方法不是最佳的”,以及指向“迈向更好的分配器模型”的链接 :)
    • 你提供的链接很有帮助!
    【解决方案2】:

    两者并不矛盾。分配器是 STL 库的容器适配器用来分配内存块以供对象使用的 PolicyPattern 或 StrategyPattern。

    这些分配器经常通过允许优化内存分配 * 要立即分配的元素范围,然后使用放置新的位置进行初始化 * 根据块大小从辅助的、专门的堆中选择项目

    不管怎样,最终结果将(几乎总是)是用新的(放置或默认)分配对象


    另一个生动的例子是boost 库实现了智能指针。因为智能指针非常小(开销很小),分配开销可能会成为负担。对于实现来说,定义一个专门的分配器来进行分配是有意义的,因此人们可能拥有高效的 std::set 智能指针、std::map<...> 等。

    (现在我几乎可以肯定,boost 实际上优化了大多数智能指针的存储,通过避免任何虚拟,因此 vft,使类成为 POD 结构,只有原始指针作为存储;某些示例将不适用。但话又说回来,外推到其他类型的智能指针(引用智能指针、指向成员函数的指针、指向具有实例引用的成员函数的指针等))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      • 2013-06-05
      • 1970-01-01
      相关资源
      最近更新 更多