随笔分类 - STL源码
个人学习心得,参考于《STL源码解析》
摘要:栈(stack) stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个口,平常在我们写深度优先遍历算法时,,就会用到栈,stack允许我们增加,移除,取得最顶端元素。但是除了最顶端元素之外,没有任何其他方法可以存取stack的其它元素,因此stack不允许有
阅读全文
摘要:STL 所有容器应用到了空间配置器,当然 deque 在 _Deque_base 中设置了 两个空间配置器,一个负责缓冲区元素的空间配置,一个负责中控器map的指针空间配置: 当然可以追溯下元素空间配置用的配置器是啥: 咱们看看 _Base::get_allocator() 在哪里 可以知道,其实
阅读全文
摘要:由于迭代器内对各种指针都进行了重载操作,所以各种指针运算如++,--等都不能直观视之,最关键的是缓冲区边缘的相关操作,可能需要 _M_set_node 跳一个缓冲区: 以下几个运算子保证了迭代器的正常运行,其中还涉及到相互调用,也不难理解:
阅读全文
摘要:vector 是单向开口的连续线性空间,deque 则是一种双向开口的连续线性空间,也就是说deque能够在其容器两端分别做元素的插入和删除操作,vector 当然也可以从头尾两端进行操作,不过其头部插入或者删除元素的效率贼差,建议大家少用为妙。 deque 是连续空间,但是连续却是假象,实际上 d
阅读全文
摘要:vector 容器的元素操作函数有很多,我就选取四个讲解一下,首先是pop_back()函数,pop() 函数的作用是将尾端元素拿掉并调整大小,并不涉及到容量的改变: ease() 函数作用是清除某一个元素,或者清除两个迭代器之间的所有元素,如下: 第二个 erase 示意图如下: insert函数
阅读全文
摘要:咱们先来做一个测试capacity是容器容量,size是大小: 运行结果: 可以观察到每次容器满了需要扩容的时候,容量总是呈现两倍增长,而且每次扩容,容器第一个元素所在地址都会发生改变,由此我们知道,容器的扩容时实际是另外寻找一片更大的空间,VS的如下: 扩容的倍数不一样VS为1.5倍扩容,最好的扩
阅读全文
摘要:vecotr 一词原来的意思是:矢量,向量,航向,顾名思义指的就是类似于数组的一个存储数据的序列,因此所采用的数据结构非常简单:连续的线性空间,它以两个迭代器 _M_start 和 _M_finish 分别指向配置得来的连续线性空间中目前已被使用的范围,并以迭代器 _M_end_of_storage
阅读全文
摘要:迭代器(iterators)是一种抽象的设计概念,23种设计模式中迭代器模式定义为:提供一种方法,使之能够依次巡访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表述方式。 在STL的实际运用中,迭代器扮演着重要的角色,STL的中心思想在于:将数据和算法分开,彼此独立设计,最后以一贴胶合
阅读全文
摘要:_S_chunk_alloc() 函数负责从内存池取出空间给free-list,如果内存池内存充足,则直接拿出足够的内存块给自由链表,如果内存不够所有需求但是对一小块需求能满足,则拿出一小块内存给自由链表并返回,如果一点儿内存也没有,则进行遍历压榨,最终如果真的没有,就只能求助于第一级配置器。代码如
阅读全文
摘要:1、第二级配置器的空间配置函数:allocate() __default_alloc_template 拥有配置器的标准接口函数 allocate(),毫无疑问,该函数首先得判断区块大小,大于128bytes就是用第一级配置器,小于或者等于128bytes 就检查对应的free-list,如果 fr
阅读全文
摘要:SGI STL 第二级配置器使用的是memory pool,即内存池,相比较于第一级空间配置器,第二级空间配置器多了许多限制,主要是为了防止申请小额区块过多而造成内存碎片。当然小额区块在配置时实际上是对空间配置器效率的一种伤害。另外,索求任何一块内存,都得需要一些额外内存来进行标记,虽然这些标记占内
阅读全文
摘要:当operator new无法满足某一内存分配需求时,它会抛出异常。以前它会返回一个null指针,某些旧式编译器目前也还那么做。当operator new抛出异常以反映一个未获满足的内存需求之前,它会先调用一个客户指定的错误处理函数,一个所谓的 "new-handler",当然operator ne
阅读全文
摘要:在第一级配置器中,一开始就定义了内存分配出错的宏接口,如下: 先弄清楚第一级配置器如何工作,注意没有template型别参数,因为我们只是分配空间,并不进行对象的构造,至于非型别参数 "__inst" ,就没怎么派上用场,如下: 第一级配置器以 malloc()、free()、realloc()等
阅读全文
摘要:在STL源代码中,对象构造前的空间配置和对象析构后的空间释放,由<stl_alloc.h>负责,SGI STL的空间配置器考虑到了多线程状态以及线程资源分配和线程切换、内存不足、内存堆区空间的申请、过多“小型区块”可能造成内存碎片(fragment)等一系列问题。 C++负责内存配置基本操作的是 :
阅读全文
摘要:以下是这两个函数的整体示意图: construct()和destroy()函数必须被设计为全局函数,STL规定空间配置器必须包含这两个成员函数,但是std::alloc的配置器并没有遵循这一规则。 以下是包含在<stl_construct.h>头文件中的两个函数的的定义: 上述 _Construct
阅读全文
摘要:SGI STL 的配置器与标准规范不同,SGI STL默认空间配置器为std::alloc, SGI STL allocator并不完全符合标准规格,但是这并不影响我们引用其代码,因为我们通常使用的是缺省的空间配置器,很少需要自己指定配置器。 SGI STL allocator只是对::operat
阅读全文
摘要:将以上空间配置器 m_allocator::_m_alloctor应用于程序中,只能有限度搭配PJ STL 和RW STL(两种不同版本STL源码),因为PJ STL未完全遵循STL规格,其所供应的许多容器都需要一个非标准的空间配置器接口allocator::_Charalloc(), 而RW ST
阅读全文

浙公网安备 33010602011771号