STL内存分配方式

news/2024/11/8 6:49:37/

在这里插入图片描述
在STL中考虑到小型区块所可能造成的内存碎片问题,SGI STL设计了双层级配置器,第一级配置器直接使用malloc()和free();第二级配置器则视情况采用不同的策略:当配置区块超过128bytes 时,则视之为足够大,便调用第一级配置器;当配置区块小于128bytes时,则视之为过小,为了降低额外负担,便采用复杂的内存池的方式来整理,而不再求助于第一级配置器。

每次配置器需要向系统要内存的时候,都不是按客户需求向系统申请的,而是一次性向系统要了比需求更多的内存,放在内存池里,有一个free_start和 free_end指示剩余的空间(也就是说内存池剩余的空间都是连续的,因此每次重新向system heap要空间的时候,都会把原先内存池里没用完的空间分配给合适的free list。)当free-list中没有可用区块了的时候,会首先从内存池里要内存,同样,也不是以按客户需求要多少块的,而是一次可能会要上20块,如 果内存池内空间允许的话,可能会得到20个特定大小的内存,如果内存池给不了那么多,那么就只好尽力给出;如果连一个都给不出,那么就要开始向系统即 system heap要空间了。换算的标准是bytes_to_get=2*total_bytes+ROUND_UP(heap_size>>4)。这个时候使用的是malloc,如果没成功,就尝试着从大块一点的freelist那里要一个来还给内存池,如果还是不行,那么会调用第一级空间配置器的 malloc::allocate,看看out-of-memory机制能做点什么。

假设我们向系统要x大小的内存,
(1)x大于128byte,用第一级配置器直接向系统malloc,至于不成功的处理,过程仿照new,通过set_new_handler来处理,直到成功返回相应大小的内存或者是抛出异常或者是干脆结束运行;
(2)x小于128byte,用第二级配置器向内存池相应的free_list要内存,如果该freelist上面没有空闲块了,
(2.1)从内存池里面要内存,缺省是获得20个节点,如果内存池中剩余的空间不能完全满足需求量,但足够供应一个(含)以上的区块,则应尽力满足需求。
(2.2) 如果一个都不能够满足的话,则从系统的heap里面要内存给到内存池,换算的标准是 bytes_to_get=2*total_bytes+ROUND_UP(heap_size>>4),申请的大小为需求量的两倍加上一个 附加值,如果内存池中还有剩余的内存,则将残余零头分配给适当的free list,这时使用的是系统的malloc,如果要不到:
(2.3)从比较大的freelist那里要内存到内存池,如果还是要不到:
(2.4) 从系统的heap里面要内存给到内存池,换算标准跟2.2一样,但是这时候使用的是第一级配置器的allocate,主要是看看能不能通过 out_of_memory机制得到一点内存。所以,freelist总是从内存池里要内存的,而内存池可能从freelist也可能从系统heap那里 要内存。
SGI STL的alloc的主要开销就在于管理这些小内存,管理这些小内存的主要开销就在于,每次freelist上的内存块用完了,需要重新要空间,然后建立 起这个list来。freelist上的内存,会一直保留着直到程序退出才还给系统。但这不会产生内存泄漏,一来是管理的都是小内存,二来是,占用的内存 只会是整个程序运行过程中小内存占用量最大的那一刻所占用的内存。在这里插入图片描述


http://www.ppmy.cn/news/241129.html

相关文章

内存分配量计算

内存池采用了slab分配思路,内存被划分成多种不同大小的内存单元,在分配内存时根据使用者请求的内存大小进行计算,匹配最接近的内存单元。在计算时分下面几种情况: 请求的内存大小是否超过了chunkSize,如果已超出说明一…

输入压缩空间量是分区量吗_如何调整分区大小,系统分区该分几个?

小编今天讲下新电脑 调整分区大小 和 系统分区数量 的问题。目前出厂电脑部分仅有一个 C 盘( 机械硬盘笔记本常见 )存在,还有预分 C ( 常见容量在 70 - 80 GB 之间 )和 D 两个分区。小编建议 前者 再分区个 D 盘用来 保存文件、安装软件,建议 后者 对 C 盘进行扩容至 100GB 以…

位段和联合体的内存分配及大小计算

目录 一、位段 二、联合体 一、位段 位段一次开辟1或4个字节的空间,不够再继续开辟。 struct A {int a : 2;int b : 5;int c : 10;int d : 30; }; int a : 2; 给a分配两个byte的内存空间 因为a的参数类型为int,一次开辟4个字节 a占2byte&#xf…

STL中的内存分配方式

转自(http://www.cnblogs.com/LUO77/p/5824625.html) 在STL中考虑到小型区块所可能造成的内存碎片问题,SGI STL设计了双层级配置器,第一级配置器直接使用malloc()和free();第二级配置器则视情况采用不同的策略:当配置区块超过128bytes 时&am…

S32K144内存分配

本文将通过实际的工程代码介绍NXP S32K144单片机变量地址分配,应用笔记仅用于自己学习及大家参考。 示例代码如下: uint8_t num_byte[4]; uint32_t num_word; const uint32_t num_word_const 0x1234; uint32_t *point_heap; int main(void) { uint8_t…

内存管理(一)——内存分配

前言 我们都知道,计算机工作的过程概括起来就是 CPU 去内存中读取指令并执行的过程,但是如果运行我们的程序直接操作物理内存,将会引发很多的问题(比如不同进程之间访问/修改的隔离、权限等等),所以爱操心…

DDR3地址及容量大小

DDR3 地址线 DDR3为减少地址线,把地址线分为行地址线和列地址线,在硬件上是同一组地址线;地址线和列地址线是分时复用的,即地址要分两次送出,先送出行地址,再送出列地址。 一般来说列地址线是10位&a…

STM32——根据地址计算存储空间的大小

首先要知道 1MB1024KB 1KB1024Byte 1Byte8bit 存储空间大小结束地址-起始地址1(用十进制来算,得到结果的单位是Byte) 十六进制与2进制转换表 十六进制2进制00000100012001030011401005010160110701118100091001A(10&#xf…