【空间配置器】空间的申请和释放

本文介绍了SGI STL实现中的两级配置器策略,旨在优化内存分配,减少碎片。当配置区块大于128字节时,直接使用malloc和free;小于128字节时,通过内存池管理。内存池维护自由链表,提高小额内存配置效率。通过调整内存需求量至8的倍数来简化管理。配置器的选择取决于是否定义__USE_MALLOC宏。
摘要由CSDN通过智能技术生成

文章目录


STL的实现有多个版本,其中 SGIGCC所采用。 SGI属于 open source的一员,但不属于 GNU GPL

SGI STL的配置器的名称是alloc,每一个容器的实现都指定了其缺省的空间配置器为allocalloc不接受任何模版型别参数。

template <class T, class Alloc = alloc>
class vector { ... };

C++的内存配置(申请)的基本操作是::operator new(),内存释放的基本操作是::operator delete()。这两个全局函数相当于Cmalloc()free()

两级配置器

考虑到小型区块所可能造成的内存碎片问题,SGI设计了双层级配置器。

第一级配置器直接使用mallocfree

第二级配置器视情况采用不同的策略:当配置区块大于128字节时,便调用第一级配置器;当配置区块小于128字节时,便采用memory pool管理内存。使用内存池管理时,每次配置一大块内存,并维护对应的自由链表free-list。下次若再有相同大小的内存需求,就直接从free-list中取出,如果释放了小区块内存,就由配置器回收free-list中。为了方便管理,第二级配置器会主动将任何小额区块的内存需求量上调至8的倍数

SGI的实现中,把alloc用作第一级配置器还是第二级配置器取决于是否定义__USE_MALLOC

#ifdef __USE_MALLOC
typedef __malloc_alloc_template<0> malloc_alloc;
typedef malloc_alloc alloc; // alloc作为第一级配置器,使用malloc配置内存
#else
typedef __default_alloc_template<__NODE_ALLOCATOR_THREADS, 0> alloc; // alloc作为第二级配置器
#endif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值