分配器 allocator 对容器的效率至关重要
operator new() 和 malloc()
所有的 C++ 平台上,operator new()函数里面都调用了 malloc()函数。
malloc 实际上向内存索要的空间,比它实际上返回的要多。

而 operator delete() 函数里调用 free() 函数。
allocate 和 deallocate
VC6 附带的标准库中,allocator 的实现如下
1 | template<class _Ty> |
其中用到的 _Allocate() 定义如下:
1 | template<class _Ty> inline |
可以看出,allocate() 调用 _Allocate(),_Allocate() 调用 operator new(),而 operator new() 最终又会调用 malloc()
VC6 的 allocator 只是以 ::operator new 和 ::operator delete 完成 allocate() 和 deallocate(),没有任何特殊设计。
在 BC5 和 G2.9 中也是如此:BC++ 和 G++ 的 allocator 只是以 ::operator new 和 ::operator delete 完成 allocate() 和 deallocate(),没有任何特殊设计。
1 | int* p = allocator<int>().allocate(512, (int *)0); |
其中,allocator<int>() 产生一个临时的对象。
结合前面所述,“malloc 实际上向内存索要的空间,比它实际上返回的要多。”,因此 allocator 这种分配器不是一种很合适的方式。
G2.9 STL 对 alloctor 的使用
G2.9 使用 alloc 而不是 allocator 分配器。

G4.9 中的分配器
在 G4.9 中,分配器换成了

如果想使用 2.9 中的分配器,用法为:
1 | vector<string, __gnu_cxx::__pool_alloc<string>> vec; |

