分配器 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; |