union obj{union obj * free_list_link;char client_data[1];
};static void * allocate(size_t n)
{obj * __VOLATILE * my_free_list;obj * __RESTRICT result;// 如果大于__MAX_BYTES就调用第一级配置器if (n > (size_t) __MAX_BYTES) {return (malloc_alloc::allocate(n));}// 寻找free_list中适当的一个my_free_list = free_list + FREELIST_INDEX(n);// 1.这里表明my_free_list指向的值是实际分配的内存result = *my_free_list;if (result == 0) {void *r = refill(ROUND_UP(n));return r;}// 2.但这里又表明my_free_list指向的值是下一块空闲的obj的地址*my_free_list = result -> free_list_link;return (result);
};

我的理解

1.free_lists是一个指针数组,指向实际的内存

2.实际的内存的前4个字节是union结构,其中前4个字节指向下一个可用的block

3.返回实际的内存地址后,free_lists里面的指针更新为下一个内存地址

下面这张图来源于stl源码剖析

空间释放函数deallocate

static void deallocate(void* p, size_t n)
{obj* q = (obj*)p;obj* volatile* my_free_list;if (n > (size_t)__MAX_BYTES){malloc_alloc::deallocate(p, n);return;}my_free_list = free_list + FREELIST_INDEX(n);q->free_list_link = *my_free_list;*my_free_list = q;
}

重新填充free_list,啥意思呢?就是没有可用区块的时候,需要重新分配一个

template<bool threads, int inst>
void* __default_alloc_template<threads, inst>::refill(size_t n)
{int nobjs = 20;char* chunk = chunck_alloc(n, nobjs);obj* volatile *my_free_list;obj* result;obj* current_obj, *next_obj;int i;if (1 == nobjs) return(chunk);my_free_list = free_list + FREELIST_INDEX(n);result = (obj*)chunk;*my_free_list = next_obj = (obj_*)(chunk + n);for (int i = 1; ; i++){current_obj = next_obj;next_obj = (obj*)((char*)next_obj + n);if (i == nobjs - 1) {current_obj->free_list_link = 0;break;}else{current_obj -> free_list = next_obj;}}return result;
}

内存池

template<bool threads, int& inst>
char __default_alloc_template<threads, inst>::
chunk_alloc(size_t size, int& nobjs)
{char* result;size_t total_bytes = size * nobjs;size_t bytes_left = end_free - start_free; // 内存池剩余空间if (bytes_left >= total_bytes) // 内存池剩余空间完全满足需求量{result = start_free;start_free += total_bytes;return result;}else if (bytes_left >= size){nobjs = bytes_left/size;total_bytes = size * nobjs;result = start_free;start_free += total_bytes;return result;}else{size_t bytes_to_get = 2 * total_bytes + ROUND_UP(head_size >> 4);}}

STL二级配置器allocate的解析相关推荐

  1. STL——空间配置器剖析(一级空间配置器、二级空间配置器的本质及运用场合,是如何用内存池去管理的)

    一级空间配置器.二级空间配置器的本质及运用场合,是如何用内存池去管理的 研究了好久才写好的,主要是二级配置器,大标题小标题什么的可能没有安排好,先 写了原理上的内容,再剖析了各个函数源码,各个目录可以 ...

  2. 【STL】STL空间配置器

    STL标准规格告诉我们,STL配置器定义于<memory>中,而SGI的<memory>中含有两个文件. #include<stl_alloc.h> //内存空间的 ...

  3. 揭秘——STL空间配置器

    为什么要有空间配置器呢?这主要是从两个方面来考虑的. 1.小块内存带来的内存碎片问题   单从分配的角度来看.由于频繁分配.释放小块内存容易在堆中造成外碎片(极端情况下就是堆中空闲的内存总量满足一个请 ...

  4. 剖析SGI STL空间配置器(空间配置器的重要性和重要成员及函数)

    剖析SGI STL空间配置器 在我们使用STL容器的时候,模板最后一个参数会有一个默认的allocator作为容器模板的参数,这个参数就是STL的空间配置器.容器的空间配置器见这篇文章:容器空间配置器 ...

  5. SGI STL 空间配置器

    文章目录 一.空间配置器 二.为什么使用空间配置器? 三.construct.h 四.std::alloc的实现 关于std::alloc stl_alloc.h 空间的配置与释放 一级配置器 二级配 ...

  6. 【STL深入学习】SGI STL空间配置器详解(二)-第二级空间配置器

    本文讲解SGI STL空间配置器的第二级配置器. 相比第一级配置器,第二级配置器多了一些机制,避免小额区块造成内存的碎片.不仅仅是碎片的问题,配置时的额外负担也是一个大问题.因为区块越小,额外负担所占 ...

  7. 【STL深入学习】SGI STL空间配置器详解(一)-第一级空间配置器

    一.SGI STL配置器简介 SGI STL的配置器与众不同,它与标准规范不同.如果要在程序中明确使用SGI配置器,那么应该这样写: vector<int,std::alloc> iv; ...

  8. 剖析SGI STL空间配置器(deallocate内存回收函数和reallocate内存扩充函数)

    剖析SGI STL空间配置器(deallocate内存回收函数和reallocate内存扩充函数) deallocate内存回收函数 deallocate函数的定义: static void deal ...

  9. STL空间配置器(二)

    ***上一篇是对STL空间配置器的入门级理解,在这一篇中,我将讨论更加深入的SGI STL空间适配器的内容.在下一节中,我将根据自己的理解,结合STL标准接口,实现一个符合STL标准的具有次级配置能力 ...

最新文章

  1. java编程打印以下图形,分享java打印简单图形的实现代码
  2. python+OpenCV图像处理(一)读取、复制、显示、保存
  3. python with关键字_完全理解Python关键字with与上下文管理器
  4. 【英语学习】【Level 08】U05 Better option L3 Everything's a click away
  5. jqGrid常用方法
  6. poj 1986 Distance Queries LCA
  7. 《Android 第1行代码》读后感—第1章【开始启程,你的第一行Android代码】
  8. 超出部分用省略号代替的样式
  9. 如何格式化电脑_内存卡格式化不了怎么办?教你两招
  10. iOS UILabel字体设置
  11. mysql读mdf_mdf文件导入mysql,mysql怎么导入mdf文件 | 帮助信息-动天数据
  12. 几种简单的图像加密方法
  13. ArduinoUNO实战-第八章-无源蜂鸣器
  14. 番茄工作法 计划表格式
  15. 第10章项目干系人管理__权力利益分配
  16. 锐捷服务器虚拟化技术_交换机虚拟化技术.ppt
  17. 第一次用 Mac git 遇到的一些问题及解决方法,记录一下
  18. CART算法(机器学习)
  19. Python和Pycharm运行环境有关问题详解
  20. mysql pt 慢日志_MySQL优化之慢日志分析(Anemometer+Pt-query-digest)

热门文章

  1. 打开sql server 验证
  2. C语言笔试题--从CSDN转发
  3. 创建 桌面、发送到...、快速启动栏、开始菜单、程序菜单、右键菜单 快捷方式...
  4. ASP.NET 页生命周期概述
  5. 深入学习Redis高可用架构:哨兵原理及实践
  6. Facebook Messenger月用户数不断攀升 突破12亿
  7. 装机必备软件 - 吾爱破解论坛会员专用版
  8. System Center 2012 R2 CM系列之安装Configuration Manager
  9. Linux C编程一站式学习读书笔记——socket编程
  10. -bash:command not found