STL之内存管理

STL以泛型思维为基础,提供了6大组件:容器(containers)、算法(algorithms)、迭代器(iterators)、仿函数(functors)、适配器(adapters)、分配器(allocators)。

容器

    vector、list、deque、set、map等,用来存放数据。从实现的角度来看,容器就是一种class template。

算法

    sort、find、copy等,从实现的角度来看,算法就是一种function template。

迭代器

    从实现的角度来看,迭代器是一种将operator*、operator->、operator++、operator--等指针相关操作予以重载的class template。

仿函数

    从实现的角度来看,仿函数是一种重载了operator()的class或class template。

适配器

    一种用来修饰容器或仿函数或迭代器接口的东西。

分配器

    负责空间的配置与管理。

容器通过分配器取得数据存储空间,算法通过迭代器存取容器内容,仿函数可以协助算法完成不同的策略变化,适配器可以修饰或套接仿函数。

STL分配器:std::alloc

四大函数:

    alloc::allocate()          //内存分配

    alloc::deallocate()      //内存释放

    ::construct()             //对象构造

    ::destroy()               //对象析构

内存管理:

    STL使用两级分配器进行内存管理。请求大于128 bytes使用一级分配器,请求小于128 bytes使用二级分配器。一级分配器通过malloc()、free()进行内存的分配与释放。

二级分配器比较复杂。

__default_alloc_template {
    free_list[16];        //16个链表
    char  *start_free;   //内存池开始位置
    char  *end_free;}   //内存池结束位置
};

    二级分配器维护16个list,分别负责大小为8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128 bytes的小块内存的分配与回收。

具体过程如下:

    请求小于128 bytes时,根据请求大小,找到对应链表。链表不空,取下一块内存分配,分配过程结束。否则求助内存池。成功,分配结束。否则通过malloc调用请求heap,成功,分配结束。否则

在16个链表中位于之前对应链表后面的链表中寻找可用内存块,成功,分配结束。否则求助一级配置器。

原文地址:https://www.cnblogs.com/gattaca/p/4701066.html