当前位置:网站首页>剖析SGI STL空间配置器(allocate内存分配函数)
剖析SGI STL空间配置器(allocate内存分配函数)
2022-07-30 07:38:00 【刚入门的代码spa技师】
剖析SGI STL空间配置器(allocate内存分配函数)
要理解allocate函数是如何分配内存,就要先知道他是怎么管理内存的。
allocate函数的定义如下:
/* __n must be > 0 */
static void* allocate(size_t __n)
{
void* __ret = 0;
if (__n > (size_t) _MAX_BYTES) {
__ret = malloc_alloc::allocate(__n);
}
else {
_Obj* __STL_VOLATILE* __my_free_list
= _S_free_list + _S_freelist_index(__n);
// Acquire the lock here with a constructor call.
// This ensures that it is released in exit or during stack
// unwinding.
# ifndef _NOTHREADS
/*REFERENCED*/
_Lock __lock_instance;
# endif
_Obj* __RESTRICT __result = *__my_free_list;
if (__result == 0)
__ret = _S_refill(_S_round_up(__n));
else {
*__my_free_list = __result -> _M_free_list_link;
__ret = __result;
}
}
return __ret;
};
参数__n是要申请内存的大小,如果大于128字节,就不受二级空间配置器管理,直接通过malloc申请,但不是简单的只做malloc,对其进行了一层封装,在malloc失败时会有异常处理,具体怎么处理后面介绍。
而如果申请的内存大小 小于128字节,就会到二级空间配置器来处理了。二级空间配置器的结构如下图:
自由链表_S_free_list的结点存放一条链表,链表的的起始地址表示一块大小为(下标+1)8的内存,要在二级空间配置器上申请一块内存,需要获取对应大小内存在自由链表的下标,_Obj* __STL_VOLATILE* __my_free_list = _S_free_list + _S_freelist_index(__n);这句的代码就是用来定位的,需要注意是用一个二级指针接收的,如果__my_free_list为空,表示没有对应大小的内存块,这时候就需要调用_S_refill函数取填充了,具体怎么填充后面介绍。如果不为空表示有对应大小的内存块,直接把链表的第一个结点返回给用户,再更新链表头节点即可。
# ifndef _NOTHREADS
/*REFERENCED*/
_Lock __lock_instance;
# endif
在多线程环境下,因为自由链表定义在数据段,自由链表需要互斥的访问,在C++STL的设计完全没有考虑多线程,而SGI STL是线程安全的。
边栏推荐
猜你喜欢

基于SSM实现个性化健康饮食推荐系统

【无标题】

typescript8-类型注解

typescript8 - type annotations
![ES报错处理-mapper [xx.xx] of different type, current_type [text], merged_type [keyword]](/img/48/064348ec4d7c2a4fa6ffe7a4778ced.png)
ES报错处理-mapper [xx.xx] of different type, current_type [text], merged_type [keyword]

MagicDraw secondary development process

The difference between typescript3-ts and js

电脑文档误删除怎么恢复,恢复误删除电脑文档的方法

JS中对事件流的理解

typescript5 - compile and install ts code
随机推荐
最右的一道面试算法题,--特殊基因
基于SSM实现个性化健康饮食推荐系统
Burpsuite几种爆破方式
2022年施工企业数字化转型思考,施工企业数字化转型之路
英语语法-名词性从句
Lenovo Notebook How to Change Windows 10 Boot Logo Icon
联想笔记本 如何更改Win10系统开机logo图标
muduo库学习记录(一)
ipset restore命令维护set,但原已存在的条目未删除掉
SQL注入漏洞(postgresql注入)
【SQL server速成之路】——身份验证及建立和管理用户账户
经典毕业设计:基于SSM实现高校后勤报修系统
代币(双代币)系统研究
svn中文路径 权限设定
typescript1 - what is typescript
数据分发服务 (DDS) 内置主题
开创ETC生态建设新格局 JASMINER新一批X4服务器陆续发出
C# uses RestSharp to implement Get, Post requests (2)
【Flask框架①】——Flask介绍
Common configuration