SGI STL(一)——容器allocator概述

SGISTL采用两级allocator进行内存管理,一级使用malloc/free,二级利用内存池优化小对象分配。construct和destroy函数负责对象的构造与析构。内存池的粒度为8字节对齐,最大分配单位128B,包含16个自由链表。辅助函数如_S_round_up用于内存对齐调整,_S_freelist_index确定块在自由链表中的位置。
摘要由CSDN通过智能技术生成

SGI STL 空间配置器allocator介绍

SGI STL有两个 allocator(空间配置器)

一级allocator 内存管理使用 malloc/free;

二级allocator 使用内存池实现

容器底层存储的对象的构造和析构,定义的是全局的函数模板constructdestroy完成,比如:

void push_back(const _Tp& __x) {
    if (_M_finish != _M_end_of_storage) {
      construct(_M_finish, __x);  // 调用定位new
      ++_M_finish;
    }
    else
      _M_insert_aux(end(), __x);
  }

void pop_back() {
    --_M_finish;
    destroy(_M_finish); // 转调用析构函数
  }
void allocator::construct(pointer __p, const _Tp& __val) { new(__p) _Tp(__val); }
void allocator::destroy(pointer __p) { __p->~_Tp(); }

重要类型和变量定义

在文件 stl_alloc.h中:

// 内存池的粒度信息
enum {_ALIGN = 8};  // 内存池分配内存对齐单位
enum {_MAX_BYTES = 128};
enum {_NFREELISTS = 16}; // 自由链表数量

// 每个内存chunk块的头信息
union _Obj {
        union _Obj* _M_free_list_link;
        char _M_client_data[1];    /* The client sees this.        */
};

// 组织自由链表的数组,数组的每个元素是 _Obj*,全部初始化为0
static _Obj* __STL_VOLATILE _S_free_list[_NFREELISTS]; // 内存池最大的分配单位是128B,16个trunk的list

自由链表数组图示如下

在这里插入图片描述

Chunk allocation state. 记录内存chunk块的分配情况

static char* _S_start_free;
static char* _S_end_free;
static size_t _S_heap_size;
template <bool __threads, int __inst>
char* __default_alloc_template<__threads, __inst>::_S_start_free = 0;
template <bool __threads, int __inst>
char* __default_alloc_template<__threads, __inst>::_S_end_free = 0;
template <bool __threads, int __inst>
size_t __default_alloc_template<__threads, __inst>::_S_heap_size = 0;

重要的辅助接口函数

// 将 __bytes 上调至最邻近的 8 的倍数
static size_t _S_round_up(size_t __bytes)
{ return (((__bytes) + (size_t) _ALIGN-1) & ~((size_t) _ALIGN - 1)); }

// 返回 __bytes 大小的chunk块位于 free-list 中的编号
static size_t _S_freelist_index(size_t __bytes) {
return (((__bytes) + (size_t)_ALIGN-1)/(size_t)_ALIGN - 1); }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值