当前位置:网站首页>剖析SGI STL空间配置器(_S_refill内存块填充函数)
剖析SGI STL空间配置器(_S_refill内存块填充函数)
2022-07-30 07:38:00 【刚入门的代码spa技师】
剖析SGI STL空间配置器(_S_refill内存块填充函数)
通过allocate函数申请内存块时,会在对应自由链表下取内存块,当该位置下没有内存块链时,就需要调用_S_refill,填充该位置下的内存块,比如刚开始时,每个自由链表_S_free_list的结点都为nullptr,就需要填充内存块。
_S_refill的函数定义如下:
template <bool __threads, int __inst>
void* __default_alloc_template<__threads, __inst>::_S_refill(size_t __n)
{
int __nobjs = 20;
char* __chunk = _S_chunk_alloc(__n, __nobjs);
_Obj* __STL_VOLATILE* __my_free_list;
_Obj* __result;
_Obj* __current_obj;
_Obj* __next_obj;
int __i;
if (1 == __nobjs) return(__chunk);
__my_free_list = _S_free_list + _S_freelist_index(__n);
/* Build free list in chunk */
__result = (_Obj*)__chunk;
*__my_free_list = __next_obj = (_Obj*)(__chunk + __n);
for (__i = 1; ; __i++) {
__current_obj = __next_obj;
__next_obj = (_Obj*)((char*)__next_obj + __n);
if (__nobjs - 1 == __i) {
__current_obj -> _M_free_list_link = 0;
break;
} else {
__current_obj -> _M_free_list_link = __next_obj;
}
}
return(__result);
}
参数__n是要填充chunk块的大小,要填充chunk块,内存来源就需要继续向下申请了,char* __chunk = _S_chunk_alloc(__n, __nobjs);
的功能就是。__chunk是返回的内存块首地址,__nobjs以引用的形式传进_S_chunk_alloc,_S_chunk_alloc执行结束__nobjs的值就是申请的__n大小的chunk块的块数了。
申请完成后,_S_refill函数还需要把申请到的chunk块串起来。
举个例子,参数__n为8,通过_S_chunk_alloc申请到了5块的内存,也就是40字节,后面的过程可以用下面这张图来简单概括:
最后把申请到的内存块首地址返回给allocate函数使用即可。
边栏推荐
猜你喜欢
随机推荐
typescript3-ts对比js的差别
桌面软件开发框架大赏
【三子棋】——玩家VS电脑(C语言实现)
Two Permutations(2022杭电杯)
经典毕业设计:基于SSM实现高校后勤报修系统
sql 引用变量时第一位的0被去除掉如何处理
redis多节点部署实施指引
SQL row-column conversion
求大佬解答,这种 sql 应该怎么写?
muduo库学习记录(一)
RT-Thread-GD32的SPI在切换同一总线不同挂载设备时会出现切换后乱发送数据的问题
2022年施工企业数字化转型思考,施工企业数字化转型之路
npm指令
【SQL server速成之路】——身份验证及建立和管理用户账户
ES:模板字符串的使用
Charles通过Rewrite越过OPTIONS请求拦截
Alibaba Cloud Cloud Server Firewall Settings
IDEA设置System.out.println()和main方法快捷键
数据库连接池的使用
MySql Detailed Basics