STL源码剖析笔记 —— 第一、二章

  1. C语言时代,欲将函数当做参数传递,唯有通过函数指针才能达成,但是函数指针有缺点,最重要的是它无法持有自己的状态,也无法达到组件技术中的可适配性——也就是无法再将某些修饰条件加诸于其上而改变其状态。C++可以采用仿函数形式
  2. 内存分配操作由allocation::allocate()负责,内存释放由allocate::deallocate()负责;对象构造操作由::construct()负责,对象析构操作由::destroy()负责
  3. 配置器定义于 < memory >中
  4. construct接受一个指针p和一个初值value,将初值设定到指针所指的空间上,采用placement new可以实现
     template<class T1,class T2>
     inline void construct(T1* p,const T2& value)
     {
     	new(p) T1(value);
     }
    
  5. destroy()有两个版本,第一版本接受一个指针,将该指针所指之物析构掉;第二个版本接受两个迭代器,在析构之前利用_type_traits判断该类型是否需要析构函数,如果不需要,什么都不做就结束;如果需要,循环调用第一个版本的析构函数
  6. 考虑到小型区块可能造成内存破碎的问题,SGI设计了双层级配置器第一级配置器直接使用malloc()和free(),第二级配置器则视情况采用不同的策略:当配置区块超过128 bytes,视为足够大,则调用第一级配置器;当配置区块小于128bytes时,视之为过小,为了降低额外负担,便采用复杂的memory pool整理方式,而不再求助于第一级配置器
  7. 第一级配置器中不能直接运用C++ new-handler 机制,因为它并非使用::operator new来配置内存,使用malloc(),需要自己写一个类似set_new_handler()的set_malloc_handler()。所谓的C++ new handler机制是,你可以要求系统在内存配置需求无法满足时,调用一个你所指定的函数。一旦 ::operator new无法完成任务,在丢出 std::bad_alloc异常状态之前,会先调用由客端指定的处理例程,该例程通常被称为new-handler
  8. 第二级配置器维护16个自由链表,各自管理的大小分别为8,16,24,32…128 bytes的小额区块自由链表的节点采用union,从第一字段观之,obj 可被视为一个指针,指向相同形式的另一个obj ; 从第二字段观之,obj 可被视为一个指针,指向实际区块
     union obj
     {
     	union obj* free_list_link;
     	char client_data[1];
     }
    
  9. 第二级配置器从内存池中取空间给free list使用,是chunk——alloc()的工作,默认取得20个新节点,如果内存池剩余空间不够,检查最多可以供应几个区块,如果一个都满足不了,则检查内存池是否有一些零头,如果有的话则先把零挂到对应的链表上。然后调用malloc(),分配一个需要大小的两倍和一个愈来愈大的附加量的空间。如果malloc()失败,则查看有无尚未用区块且区块足够大,找到了就挖出一块,找不到就调用第一级配置器
  10. uninitialiizes_copy、uninitialiizes_fill、uninitialiizes_fill_n对应于高阶的copy、fill、fill_n,会先判断是否是POD(传统C struct型别)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值