2011-04-11 92 views
18

根据C++入门第4版,755页,还有一张纸条写着:C++ STL分配器VS运营商新

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

我不太明白这句话。 到目前为止,我读到的所有材料都是用new来分配C++中的内存。 书中显示了矢量类如何使用分配器的示例。 但是,我想不出其他情况。

任何人都可以帮助澄清此声明?并给我更多的例子? 什么时候应该使用分配器,何时使用new?谢谢!

回答

35

对于一般编程,是的,您应该使用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来讨论其中一些问题。

+4

对于“STL方法分配器是非最优的”加上“建立更好的分配器模型”的链接:) – 2011-04-11 22:14:23

+1

您提供的链接非常有帮助! – 2011-04-14 03:45:35

1

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

这些分配器经常通过允许 *元素的范围优化存储器分配在一次要被分配,然后初始化成使用新 *物品放置到来自次级,专门堆取决于块大小

一种方式来选择或其他,最终结果将(几乎总是)是该对象与新的(位置或默认)分配


另一个生动的例子是如何如增强库实现智能指针。由于智能指标非常小(开销很小),分配开销可能会成为负担。它将使意义的实现来定义一个专门的分配做了分配,这样一个可能有高效的std ::设置<> smartpointers的,性病::地图< ...,智能指针>等

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