STL空间配置器

本文是对STL源码解析第二章的学习总结,不足之处,欢迎批评指出。

1、SGI标准的空间配置器,std::allocator

虽然SGI也定义了一个部分标准的,名为allocator的配置器,但SGI自己从未使用过,主要原因是效率不佳。它只是将c++的operator new和operator delete做一层薄薄的封装而已。注意operator new只负责内存分配,而new还要复制构造。实际上new和delete都有两个操作过程:(1)利用operator new配置内存(2)调用构造函数构造对象内容。delete也类似。

2、SGI采用的特殊配置器,std::alloc

为了精密分工,STL分配器将上述两个阶段分开来。其中内存配置使用alloc::allocate()以及alloc::deallocate()负责,对象构造由::construct()负责,对象释放有::destroy()负责。

::construct和::destroy()放置在stl_construct.h中,内存配置则放在stl_alloc.h当中。

还有一点需要注意的是,在stl_uninitialzed.h中定义了一些全局函数,用来填充或者拷贝大块内存数据。

3、构造和析构基本工具:construct和destroy

构造函数使用placement new(在已经分配好的空间上构造对象,)实现,而析构函数则需要分不同进行讨论。

(1)如果元素的数值类型有trivial destructor(无关紧要的析构器),如果是,则什么都不做就可以结束了。

(2)如果否,那么调用对应的析构函数。

4、空间(内存)的配置和释放

c++的内存配置操作(无构造)使用::operator new和::operator delete完成,相当于c中的malloc和free函数。因此,SGI使用malloc()和free()完成内存的配置和释放。

考虑到内存破碎问题,SGI设计了双层级配置器,第一层直接使用malloc()和free()——当内存分配大于128bytes,否则使用第二级配置器。

STL第一级配置器的特点:

(1)allocate()使用malloc(),deallocate()使用free()

(2)模拟了c++中的set_new_handle()以处理内存不足的情况。

STL第二级配置器的特点:

(1)维护16个自由链表,每个链表默认为20个大小相同的小块。16个自由链表指向的小块区域都是8的倍数。

(2)如果大于128bytes,就转调用第一级配置器。

具体理解,强烈推荐查看源码进行理解。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值