STL源码剖析学习

一、STL概论

1、临时对象的使用

刻意制造临时对象的方法,在型别名称之后直接加一堆小括号,并指定初值。如int(8)、vector等。

2、迭代器使用前闭后开区间表示法

3、仿函数的使用

  • 仿函数可以起到取代函数指针的作用。函数指针的缺点是无法持有自己的状态,也无法达到组件技术中的可适配性,也就是无法再将某些修饰条件加诸于其上而改变其状态。
  • 所谓的仿函数就是使用起来想函数一样的东西。如果针对某个class进行operator()重载,它就成为一个仿函数。

二、空间适配器

空间适配器主要用于容器的空间配置。如:vector<class T, class alloc >,默认的空间适配器为std::alloc

1、C++内存配置操作和释放操作

  • new算式包含两个阶段:(1)调用::operator new配置内存;(2)调用构造函数构建对象内存。
  • delete算式包含两个阶段:(1)调用析构函数将对象析构;(2)调用::operator delete释放内存。

2、构造和析构的基本工具:construct()和destory()

3、空间的配置和释放

双层配置器:第一级配置器直接使用malloc()和free();第二级配置器则视情况采用不同的策略:当配置区块超过128bytes时,设置为足够大,便调用第一级配置器;当配置区块小于128bytes时,使用复杂的memory pool方式。

4、第二级配置器小内存配置方式

  • 维护16个free-lists链表,分别存储8-128bytes的8的倍数的空闲内存区,进行空间的分配。有内存需求时则从链表里拨出,如果释放小额区块,则会受到链表中。
  • 如果链表某个大小的空间不够,则调用refill函数重新获得空间,其中通过chunk_alloc函数从内存池中进行内存申请。该函数首先判断内存池是否充足,充足则直接提供内存;如果不足提供所有的区块,但足够供应一个以上的区块,则拨出尽可能多的区块;如果一个区块都无法供应,就利用malloc从堆中配置内存;如果仍失败,就从区块大的free-lists中找内存分出;找不到就智能调用第一级配置器;第一级配置器其实也是使用malloc配置内存,担忧out-of-memory处理机制,如果可以就成功,否则发出bad_alloc异常。

5、内存基本处理工具

  • 主要包括:construct、destory、uninitialized_copy、uninitialized_fill、uninitialized_filln。
  • 后三者分别对应高层次函数copy、fill、filln(都是STL算法),底层主要分两种方式:首先判断迭代器的value_type是否为POD(plain old data,包括标量型别或传统的C struct型别)类别:如果是就采用最有效率的系统默认初值填写手法(trival ctor/dtor/copy/assignment函数);否则采取最安全的底层迭代法。

6、set_new_hander(new_hander, new_p)

指向的函数new_hander为new操作和new[]失败时调用的处理函数。

7、placement new操作

如new( p) T1(value),在指针所指向的内存空间创建一个T1类型的对象,但对象的内容是T2类型的对象value转换而来的。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值