声明分析的代码版本:
GCC 2.95.3
前言
尽管在我们使用STL的时候,机会不怎么使用空间配置器,但是空间配置器是STL中最重要的步,我们使用容器的时候,之所以不用管理内存,都是因为有空间配置器。所以在剖析具体容器之前,先剖析空间配置器。
其他版本的配置器
vc6 使用的分配器:
vc6 下 new 调用allocator,allocator 调用 operator new,operator new 调用 malloc()
delete 调用 deallocate ,deallocate调用 operator delete, operator delete调用 free()
重点是 allocator 只是以 ::operator new 和 ::operator delete 完成 allocate() 和 deallocate(),没有任何特殊设计,就是简单的调用malloc() 和 free()
BC5.0
同上,相差不多。
GCC2.95.3
gcc 中的allocate 和 deallocate 的代码和上面两家的相差不多。–(有点尴尬)
但是
这个头文件中包含了一句话
翻译过来就是:
符合标准分配器有不同的接口,标准的默认分配器在 < memory > 这个头文件
也就是说尽管 gc2.95.3 中有这个分配器,但是不去使用它,使用的是另一个版本。那么另一个版本是什么呢?
找个具体的容器看看它使用的是哪个分配器
从源代码中可以看到,使用的是 __STL_DEFAULT_ALLOCATOR(_Tp)
继续追踪
追踪到这里发现,默认的分配器是这个。
而这里的处理就和之前的分配器处理的不同。具体的好处在哪,这里就不在赘述。之前有写过一篇内存管理 来具体探讨这里的原因。
但是当我们换个版本来看看。 gcc-4.4.0
从源代码可以看出**,这里使用的不是2.95.3版本的分配器alloc,**这里有使用之前的分配器(vc6,BC),至于为什么不适用更好的分配器–我也不清楚。
但是新的版本并没有删除之前的版本的代码,如果你想使用之前的代码,也是可以的。只不过将名字改了。 原来为 alloc , 如今为 __pool_alloc
例如:
vector<string,__gun_cxx::__pool_alloc> vec;
总结
当我们使用容器的时候,默认会调用分配器。而不同的分配器的性能也有所不同。
不同的版本的GCC默认调用的分配器也不同。
当然,stl 的分配器不可能这么简单,作为初学者,只能简要剖析一下目前所需要了解的东西。
在有能力之后,继续深入剖析
最后引用侯捷大师一句话:
源码之前,了无秘密