• STL---vector的内存分配策略


     2级策略,过程如下:

    第一级 __malloc_alloc_template内存分配器

      该分配器是对malloc、realloc以及free的封装;

    第二级  __default_alloc_template

    是一个自维护的内存池,比如:

      s_free_list是这些空闲分区链的起始地址组成的数组,大小为16。这16个链表中每个链表中的空闲空间的大小都是固定的,第一个链表的空闲块大小是8bytes, 依次是16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128bytes。

    分配内存过程:

      1)如果申请的内存空间大于128bytes, 则交由第一个分配器处理

      2)分配器首先将申请内存的大小上调至8的倍数n,并根据n找出其对应的空闲链表地址__my_free_list

      3)如果该空闲链表中有可用的空闲块,则将此空闲块返回并更新__my_free_list,否则转到4)

      4)到这一步,说明__my_free_list中没有空闲块可用了,分配器会按照下面的步骤处理:

      a) 试着调用_s_chunk_alloc()申请大小为n*20的内存空间,注意的是,此时不一定能申请到n*20大小的内存空间

    b) 如果只申请到大小为n的内存空间,则返回给用户,否则到c)

        c) 将申请到的n*x(a中说了,不一定是n*20)内存块取出一个返回给用户,其余的内存块链到空闲链表__my_free_list中

    内存释放过程:

    内存的释放过程比较简单,它接受两个参数,一个是指向要释放的内存块的指针p,另外一个表示要释放的内存块的大小n。分配器首先判断n,如果n>128bytes,则交由第一个分配器去处理;否则将该内存块加到相应的空闲链表中。

  • 相关阅读:
    __init__ 构造行数的用法
    Android SDK下载安装及配置教程
    每条用例执行10次
    Python Json模块中dumps、loads、dump、load函数介绍
    Python接口测试实战2
    linux 下添加环境变量 和刷新
    mysql 练习题笔记
    http请求脚本排错指南
    docker命令及其常用事项
    anaconda 环境
  • 原文地址:https://www.cnblogs.com/luntai/p/6753994.html
Copyright © 2020-2023  润新知