Allocator - 内存配置器

来由

Allocator中文翻译为“内存配置器”。它是STL(C++标准模板库)引入的一个概念。留意一下你就可以发现,整个STL所有组件的内存均从allocator分配。也就是说,STL并不推荐使用 new/delete 进行内存管理,而是推荐使用allocator。

Allocator改变了什么?

Allocator概念的引入,意味着:

  1. 你应该使用一个对象(Object),而不是全局的new/delete来管理内存。
  2. 决定一个类对象怎么去new出来,并不是取决于该类本身,而相反是取决于使用该类的人。一个类不需要关心自身被如何创造出来,更不能假定。它需要关心的是它自己的类成员如何被创建出来,它的算法(你可以把类看做一个算法集合)涉及到的所有组件如何被创建出来。

Allocator的缺陷与改进

在我看来,STL的引入allocator,是一件了不起的事情。但是这场变革被忽视了,没有得到贯彻。当然,这也与STL的allocator本身的缺陷有关。

Allocator的引入,STL设计者主要可能还是出于将内存管理从容器的实现独立出来的设计理念作用,让STL使用者在内存管理算法上有选择的余地。设计者本身都可能也没有意识到allocator的重要性。二是allocator本身也只是侧重于关注效率上,而没有侧重于C++语言使用者对内存管理观念的变革上。《C++内存管理变革系列》引入了“GC Allocator - 支持垃圾回收的Allocator”,很好地释放了STL引入的Allocator的威力,并使得Allocator平民化1

Allocator规格

实际上,多数的STL版本,其allocator规格多多少少存在不一致性。例如:

  • Visual C++ 6.0之STL库引入了特殊的_Charalloc。详细参见《基于ScopeAlloc的STL容器》。
  • SGI STL有自己的alloc组件,其std::allocator只是自己的alloc组件的一个Wrapper。并且默认情形下使用alloc组件,而不是std::allocator。这说明SGI STL的设计者并不喜欢标准的allocator。

这种不一致性的本质原因是,STL的allocator存在一定的设计缺陷。为了更加“C++”,设计者试图去让allocator分配的内存是签名的(或者说带类型信息的)。但是,签名意味着它不是通用的内存管理组件,无法取代new/delete, malloc/free的地位。为了避免暴露类的实现细节,_Charalloc这样的东西的存在就在所难免了(rebind技术是繁琐且丑陋的)。

Allocator实作

相关参考

Page tags: allocator memory stl
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License