一起了解C++ SGI版本allocator

本文探讨了为何在C++中需要allocator,以及allocator的主要功能:内存分配、回收、对象构造和析构。SGI版本的allocator不遵循STL标准,采用malloc_alloc和default_alloc两级设计,后者包含内存池优化,减少小内存分配造成的碎片。简单alloc(simple_alloc)是对SGI allocator的封装,用于符合STL标准。
摘要由CSDN通过智能技术生成

前言

这也是面试官喜欢问的东西,咱们这次整理清楚,做好准备。

为什么要有allocator?

《stl源码剖析》提到,stl库的六大组件:容器、算法、迭代器、仿函数、适配器、配置器(allocator)。
这个问题在《primer C++》中写的很清楚。作者认为,就不应该将allocation和construction搞在一起(对没错,说的就是new),当然delete也很挫。为什么呢?因为有的时候我确实需要分配内存,但是一次分配的内存过多;分配多了也就算了(不能算了),分配完了以后还顺便给我构造了,这就更浪费cpu的资源了。
When we allocate a block of memory, we often plan to construct objects in thatmemory as needed. In this case, we’d like to decouple memory allocation from objectconstruction. Decoupling construction from allocation means that we can allocatememory in large chunks and pay the overhead of constructing the objects only whenwe actually need to create them.
再者,执行new的时候会顺便帮我执行构造函数,比如默认构造函数或者是拷贝构造函数。可是接下来我就会对内存上的变量进行一些赋值操作,这不就又做了重复劳动么!

四个主要功能

其实只要是满足allocator标准,咱们自己也可以动手写一个自己的allocator。allocator需要按照标准实现以下四点主要功能( 当然还有其他功能):
1.allocator(分配一段原始的,未构造的内存)
2.deallocator(回收一段原始的内存:如果被construct过的话一定要先destroy一下)
3.construct构造函数
4.destroy析构函数
allocator称为空间配置器,而不是内存配置器,是因为allocator可以向磁盘取空间。

一步步看看源码

我的VS用的应该不是SGI版本的stl库:

// CLASS TEMPLATE vector
template <class _Ty, class _Alloc = allocator<_Ty>>
class vector {
    // varying size array of values

SGI版本应该会显示为class _Alloc = alloc<>这种。咱们的VS编译器可能是PJ版本的stl实现。
STL标准要求STL实现一定要有std::allocator这个配置器,但是SGI版本实现并没有遵循,而是用的自己的一套std::alloc,而SGI里面的std::allocator,仅仅是对new和delete的简单封装。
所以我们研究SGI版本的alloc。
整个配置器分为两级,第一级配置器malloc_alloc和第二级配置器default_alloc,默认是后者(更高级的第二级)。
为什么要搞这种两层设计呢?是因为咱们申请的一些小的内存可能会造成内存碎片。第一级allocator呢,直接调用malloc和free进行内存的分配与释放,这就是简单的内存堆方式,用struct管理内存,作为头部信息。第二级allocator呢,就复杂一点了,它会判断你这次申请的内存大小有没有超过128Bytes。如果超过了,那么直接调用第一级allocator的方式处理,结束。如果没有超过,那么会用一些更棒的内存分配方式,如memery pool。内存池的好处在于,不仅这是一块事先就malloc好的内存,且可以方便实现内存碎片的整合。而且你还记得么?内存池会搞很多格式的内存大小哦!
刚刚咱们说,alloc不符合stl标准,咋办?那就再对alloc进行一层封装,叫simple_alloc,于是呢,SGI版本的stl就是直接对这个simple_alloc进行的调用。
咱们先来看看第一级allocator长啥样:

template <int __inst>
class __malloc_alloc_template {
   
private:
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值