STL源码剖析(侯捷)笔记——分配器

1、各容器的默认分配器

//vector
template<typename _Tp, typename _Alloc=std::allocator<_Tp>>
class vector:protected _Vector_base<_Tp, _Alloc>

// list
template<typename _Tp, typename _Alloc=std::allocator<_Tp>>
class list:protected _Vector_base<_Tp, _Alloc>

//deque,set,map,unordered_set,unordered_map同上

2、分配的分类

// gnu c++下
#include<memory> 内含std::allocator
//其他的allocator
#include<ext\array_allocator.h>
#include<ext\mt_allocator.h>
#include<ext\debug_allocator.h>
#include<ext\pool_allocator.h>
#include<ext\bitmap_allocator.h>
#include<ext\malloc_allocator.h>
#include<ext\new_allocator.h>

在这里插入图片描述
在这里插入图片描述
直接使用分配器(没必要):
在这里插入图片描述deallocate时还需要指明分配时空间的大小,很不合理,很少能够记住分配时的大小。

3、操作符new和malloc函数

在这里插入图片描述
上图为不同标准库源码中的operator new,底层均会调用malloc函数。
右侧为分配的内存,size部分是我们申请的空间大小,其他部分是操作系统附加到size中返回给我们的内容。详情见侯捷内存管理部分的内容。

4、VC6使用的allocator()

在这里插入图片描述
其allocator实现如下:在这里插入图片描述
allocator最主要的两个方法:allocate和deallocate
上图可以看出,调用关系如下:

VC6 STL源码:
allocate()->operator new()->malloc();
deallocate()->operator delete()->free();
没有任何特殊设计,只是通过调用c的malloc和free函数。
int *p = allocator<int>().allocate(512,(int*)0);
allocator<int>().deallocate(p,512);// 直接使用的话deallocate还需要记住要释放的空间大小,不好,容器使用的话释放时不需要指定该大小
BC,GC都是如此,只是实现略有区别

5、gnc c使用的默认alloc(gnu c++2.9)

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

优化:目的是减少malloc的次数,因为malloc会带有除了size之外的额外开销
在这里插入图片描述
00000041:cookie记录整块的大小

优化思路:每一个容器内的所有元素类型都是一样的,所以不必为每个变量都都加一个类型标记。在这里插入图片描述
如上图所示,有16条链表,#0指向每个节点为8个字节的链表,#1指向每个节点为16个字节的链表,依次类推,#15指向每个空间128个字节的链表。给容器元素分配空间时,查找相对应的序号的链表,看空间是否满足,不满足才会向操作系统申请内存空间。

[文档及视频资源github地址(非本人整理):https://github.com/ZachL1/Bilibili-plus]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值