STL源码剖析(一)---空间配置器

声明分析的代码版本:
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 的分配器不可能这么简单,作为初学者,只能简要剖析一下目前所需要了解的东西。
在有能力之后,继续深入剖析

最后引用侯捷大师一句话:

源码之前,了无秘密

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值