STL空间配置器之 allocate

这篇博客详细介绍了STL如何通过空间配置器进行内存管理,特别是针对小块内存的双层级配置器设计。第一级配置器在需要大块内存时直接使用malloc,而第二级配置器采用内存池和自由链表技术,解决小块内存的碎片问题和性能瓶颈。这一机制确保了更高效的内存分配和回收。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们知道new和delete管理对象时其实都内含两阶段操作,一个是对内存空间的操作,使用operator new和operator delete来申请和释放内存空间,一个是调用构造函数和析构函数来构造和销毁对象。类似的STL也需要两阶段的操作,不过为了精密分工,STL把两个阶段拆开了。

对于内存的管理,STL会使用空间配置器(allocator)的**allocate()函数来分配足够大、原始的、未命名的内存;调用deallocate()**函数来回收内存,

其中比较复杂的是allocate()函数,为了解决内存分配中会出现的内存碎片问题小块内存频繁申请和释放带来的性能问题,SGI STL设计了双层级配置器

第一级配置器

第一级配置器内部直接使用malloc来进行申请相应大小的内存空间,当需要配置的区块大小超过128字节时,认为“足够大”,使用第一级配置器。(这里使用了别人的图,找不到原地址了,侵删)
在这里插入图片描述

第二级配置器

当需要配置的区块的大小小于128字节时,认为“过小”,为了避免刚刚提到的内存碎片问题和小块内存频繁申请和释放带来性能问题,就会使用采用了内存池 + 自由链表 技术的第二级配置器进行内存分配。

整体流程图

如下:
allocate流程图
_S_refill函数内部流程图

(未完待续…)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值