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

问题描述 投票:23回答:2

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

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

我不太明白这句话。到目前为止,我阅读的所有材料都使用new进行了C ++内存分配。本书展示了向量类如何利用分配器的示例。但是,我无法想到其他情况。

有人可以帮助澄清这一说法吗?再给我更多例子吗?什么时候应该使用分配器,什么时候应该使用new?谢谢!

c++ memory stl new-operator allocator
2个回答
40
投票

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

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

图书馆的用户可能希望完全控制从何处分配的内容。如果所有库的分配都通过newdelete,则用户将无法获得这种细粒度的控制级别。

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

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

实现与STL一起使用的自定义分配器的示例,并说明:::operator delete(void*)

旁注:分配器的STL方法在几种方面都不理想。我建议阅读Improving Performance with Custom Pool Allocators for STL来讨论其中一些问题。

2019年编辑:自编写此答案以来,C ++的情况已有所改善。有状态分配器在C ++ 11中为Towards a Better Allocator Model,并且在C ++ 17中对该支持进行了改进。那些涉及“迈向更好的分配器模型”的人都参与了这些更改(例如:supported),所以很好(:


1
投票

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

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

一种或另一种方式,最终结果(几乎总是)是为对象分配了新的(放置或默认)


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

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

© www.soinside.com 2019 - 2024. All rights reserved.