分配器 allocator 对容器的效率至关重要

operator new() 和 malloc()

所有的 C++ 平台上,operator new()函数里面都调用了 malloc()函数。

malloc 实际上向内存索要的空间,比它实际上返回的要多。

operator delete() 函数里调用 free() 函数。

allocate 和 deallocate

VC6 附带的标准库中,allocator 的实现如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template<class _Ty>
class allocator{
public:
typedef _SIZT size_type;
typedef _PDFT difference_type;
typedef _Ty _FARQ *pointer;
typedef _Ty value_type;

pointer allocate(size_type _N, const void *){
return (_Allocate((difference_type)_N, (pointer)0));
}

void deallocate(void _FARQ *_P, size_type){
operator delete(_P);
}
}

其中用到的 _Allocate() 定义如下:

1
2
3
4
5
6
7
template<class _Ty> inline
_Ty _FARQ *_Allocate(_PDFT _N, _Ty _FARQ *){
if (N < 0)
_N = 0;

return ((_Ty _FARQ *)operator new((_SIZT)_N * sizeof (_Ty)));
}

可以看出,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;