美文网首页
C++STL源码学习心得

C++STL源码学习心得

作者: this_is_for_u | 来源:发表于2019-08-16 00:01 被阅读0次

配置器allocator

对于stl使用者基本接触不到allocator,需要分析源码才可以接触到allocator,也叫分配子,几乎所有的stl都使用分配子,用来非常高效的分配和释放内存。一般stl都默认使用alloc配置器。

template<class T, class Alloc=alloc>
class vector {};

首先需要理解operator new和new operator区别,简单来说new operator是关键字,而operator new是操作符,new operator = operator new分配内存+X::X()构造对象,operator delete 和delete operator类似。
operator new 相当于malloc, operator delete相当于 free

alloc包含两级配置器,第一级配置器和第二级配置器,第一级配置器其实就是malloc和free,第二级配置器则是针对于小内存,使用内存链表以及内存池来优化内存碎片问题。
当申请内存或释放内存>128bytes时,使用第一级配置器,当小于128byte时使用第二级配置器,这里详细说第二级配置器。
第二级配置器配置16个内存区块的链表,第一个链表所指向的都是8byte的内存块,第二个第三个链表依次是16,24,32等8的倍数大小的内存块。当申请的内存<128时,则向对应的这些链表中获取,如果是需要9,则去找16大小的链表,如果是需要20,则去找24大小的链表,
假设申请内存大小为n,若对应链表有空闲的内存块,则分配成功,
若没有空闲块,则去向内存池请求n×20大小的内存区,若内存池有足够空间,则分配成功,其中一个内存块返回给上层,另外19块供内存链表使用,若没有足够内存但是却可以分配多余1个n的内存,则找到最大的n分配,其中一块返回,另外的供链表使用,如果连1块大小的内存都没有,则malloc出n*40大小的内存,其中20个内存池留用,一个返回上层,另外19个给内存链表,如果malloc都失败,则遍历链表,找到第一个空闲的内存释放掉,再递归上述步骤申请内存。

相关文章

网友评论

      本文标题:C++STL源码学习心得

      本文链接:https://www.haomeiwen.com/subject/vvlxsctx.html