[每天一道面试题 c++] Day13 介绍一下STL的allocator

Day-13

问题

介绍一下STL的allocator

参考答案

参考:《STL源码剖析》chapter2 空间配置器

STL allocator封装了STL容器在内存管理上的底层细节。我们日常所习惯的内存分配是使用new运算符,内存释放是使用delete运算符。

new运算符实际包含两个步骤:

  1. 调用全局::operator new分配内存(实际上就是调用malloc分配内存)
  2. 调用对象相应的构造函数来构造对象

同理,delete运算符也包含两个步骤:

  1. 调用对象相应的析构函数来析构对象
  2. 调用全局::operator delete释放内存(实际上是调用free释放内存)

STL中,通过STL allocator将对象构造/析构和内存分配/释放两个步骤分开来。其中,对象的构造和析构是分别通过allocator::construct()(使用placement new来调用对象的构造函数)和allocator::destory()(使用对象的析构函数)来实现。内存分配/释放是分别通过allocator::allocate()(通过malloc分配内存)和allocator::deallocate()(通过free释放内存)来实现。

此外,由于allocator调用malloc来分配内存,在给小型区块分配内存时可能会产生内存碎片问题。为了解决这个问题,提高内存利用率,STL中的allocator采用了双层级配置器

当配置区块超过128 bytes便使用第一级配置器,第一级配置器中内存的申请和释放直接采用mallocfree;当配置区块小于128 bytes时便采用第二级配置器,第二级配置器中内存的申请和释放通过内存池来管理。

第二级配置器中的内存池实现细节:维护一个16个自由链表(free-lists),各自管理大小为8,16,24,32,40,48,56,64,72,80,88,…128 bytes的小额区块,每次配置或释放一块内存时,需要维护对应的自由链表。

进阶:请你实现一个简单的内存池?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值