【STL源码解析】空间适配器allocator(二)第一级空间配置器

本文深入解析STL中的一级空间配置器__malloc_alloc_template,介绍了当内存需求大于128bytes时,如何通过malloc和free进行内存分配和释放。同时阐述了在内存不足时的处理机制,以及简单分配器simple_alloc在STL容器中的应用。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

前面介绍了为什么要使用空间配置器,以及在STL源码中,构造函数和析构函数的实现形式。参考博文:空间适配器allocator(一)
接下来介绍,STL源码中如何配置内存空间。


一、空间的配置

C++中的内存分配都是调用::operator new 和 ::operator delete,其本质上还是调用的malloc和free。对于malloc来说,如果分配的内存空间很小,那么额外开销占比太大(比如cookie等额外开销)。为了避免这种额外开销,在SGI版本的STL中,采用两级分配器。
(1)分配很大(>128bytes)的内存空间时,采用的是一级配置器,即采用malloc进行内存分配。
(2)分配很小(<128bytes)的内存空间时,采用的是二级配置器。采用内存池的方式进行内存配置。
STL中通过宏 __USE_MALLOC 是否被定义判断只开放第一级配置器,或是同时开放第二级配置器。

#ifdef __USE__MALLOC  //如果定义了__USE__MALLOC
...
typedef __malloc_alloc_template<0> malloc_alloc; //一级空间配置器
typedef malloc_alloc alloc;
#else //如果没有定义__USE__MALLOC
...
//令alloc为第二级空间配置器
typedef __default_alloc_template<__NODE_ALLOCATOR_THREADS,0> alloc;
#endif
//alloc并不接受任何template参数

为了能够满足STL标准规范,对一级配置器和二级配置又包装了一层。(对外无感知有两种不同的空间配置器)

template<class T, class Alloc>
class simple_alloc{
   
public:
	static T* allocator(size_t n){
   
		return 0==n? 0:(T*)Alloc::allocate(n * sizeof(T));
	}
	static T* allocator(void){
   
		return (T*)Alloc::allocate(sizeof(T));
	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值