C ++ STL分配器vs运算符new

时间:2011-04-11 22:01:38

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

根据C ++ Primer第4版,第755页,有一条说明:

  

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

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

任何人都可以帮忙澄清这个陈述吗?并举个更多例子? 我应该何时使用分配器以及何时使用new?谢谢!

2 个答案:

答案 0 :(得分:39)

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

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

库的用户可能希望精确控制从哪里分配的内容。如果所有库的分配都经过newdelete,则用户将无法获得细粒度的控制。

所有STL容器都带有可选的allocator模板参数。然后容器将使用该分配器来满足其内部存储器需求。默认情况下,如果省略分配器,它将使用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来讨论其中的一些问题。

答案 1 :(得分:1)

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

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

这种或那种方式,最终结果将(几乎总是)是用新的(放置或默认)分配对象


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

(现在我几乎可以肯定,通过避免任何虚拟,即vft,使类成为POD结构,仅使用原始指针作为存储,boost实际上优化了大多数智能指针的存储;某些示例将不适用。但是,再次推断其他类型的智能指针(引用智能指针,指向成员函数的指针,使用实例引用等指向成员函数的指针等)。)