• 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个链表中位于之前对应链表后面的链表中寻找可用内存块,成功,分配结束。否则求助一级配置器。

  • 相关阅读:
    js基础整理总结
    pyinstaller打包django项目成exe以及遇到的一些问题
    Django对接SQL Server服务
    死锁
    python 之路
    Python注释
    Django2.1迁移数据库出错
    一行 Python 代码实现并行
    【转载】Python 类定义与对象
    关于盒模型布局在UC上的兼容处理
  • 原文地址:https://www.cnblogs.com/gattaca/p/4701066.html
Copyright © 2020-2023  润新知