阿龙的学习笔记---《STL源码剖析》---(一)

零、概述:六大组件:

  • 容器:各种数据结构
  • 算法:操作数据结构的各种算法
  • 迭代器:扮演容器和算法之间的胶合剂,泛型指针。
  • 仿函数:行为类似函数的类,重载 operator() 的 class。
  • 配接器(adapters):一种来修饰容器或者仿函数的东西。stack和queue是配接器。
  • 配置器(allocators):负责空间的配置与管理。

一、空间配置器

  • 空间配置器负责给STL容器分配空间,主要是内存,当然如果你写一个硬盘的空间配置器也是有可能实现的。
  • SGI的空间配置器是std::alloc。
    • 一般的 new 操作有两个步骤,一是分配空间,二是调用构造函数。alloc将这两个部分分开实现,而不是简单的封装new。

    • 析构和构造工具:construct() 和 destroy()

      • construct() 函数调用 placement new来实现向一块内存构造元素。
      • destroy() 有两个版本,对于单个元素的指针,直接调用析构函数。对于两个迭代器之间的元素全部析构,会判断是否有trivial destruction,如果是trivial,则是不干活的析构函数,不用挨个调用。而如果是non-trivial,则挨个调用其析构函数。
    • 空间的配置与释放:

      • SGI设计了双层的空间配置器,第一级直接考虑使用malloc和free函数来实现空间的分配;第二级主要考虑小片段的内存碎片问题,在小于128bytes的空间时,采用较为复杂的 内存池pool 的形式来进行分配与回收整理。
      • 一级空间配置器:
        • 直接调用malloc来获取空间,如果出现内存不足调用失败的时候,那么则会调用oom_malloc(),这个函数负责循环调用"内存不足处理例程",直到成功。这个例程一般由用户负责提供,如果用户没有提供,那么则会判断直接抛出bad_alloc异常。
      • 二级空间配置器:
        • 原因一是因为太多小块的内存会有碎片产生;二是对于小块内存,频繁系统分配带来的负担较大。
        • 16种大小的区块,都是8的倍数,从8~128。为每个大小的内存块维护一个链表。申请小于128的内存时,先从free list中找到够用的内存,如果没有,则会对free list进行refill操作。

二、迭代器与traits编程技巧

  • 迭代器提供一种方法,能都按序一次访问容器所含的元素,而又无需暴露容器内部的表述方式。
  • 迭代器是一种类似指针指针的对象,而此类对象主要需要实现两个功能:内容提领(operator *)和成员访问(operator ->)。一般在各个容器之中实现容器的迭代器,而不是外部,因为迭代器的操作涉及到内部实现,最好不向外暴露。
  • traits负责读取迭代器中的value_type等定义,比如一个vector<int> 的迭代器,一些地方需要 traits 出来 int 类型。也叫特性萃取机。
    • 对应的需要在迭代器中定义的类型有:value_type代表值的类型;diff啊W阿瓦达的aerence_type代表两个迭代器中的距离;以及reference_type、pointer_type、iterator_category。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值