当前位置:网站首页>剖析SGI STL空间配置器(一 、辅助接口函数)
剖析SGI STL空间配置器(一 、辅助接口函数)
2022-07-30 07:38:00 【刚入门的代码spa技师】
剖析SGI STL空间配置器(一 、辅助接口函数)
SGI STL空间配置器有两个重要的辅助函数:
static size_t _S_round_up(size_t __bytes)
{
return (((__bytes) + (size_t) _ALIGN-1) & ~((size_t) _ALIGN - 1)); }
static size_t _S_freelist_index(size_t __bytes) {
return (((__bytes) + (size_t)_ALIGN-1)/(size_t)_ALIGN - 1);
}
_S_round_up函数分析
static size_t _S_round_up(size_t __bytes)
{
return (((__bytes) + (size_t) _ALIGN-1) & ~((size_t) _ALIGN - 1)); }
在申请小块内存时,为了便于管理内存块和加快内存的分配速度,SGI STL空间配置器通过_S_round_up函数对申请的小块内存大小提升至最邻近_ALIGN的倍数,_ALIGN值默认为8。参数__bytes是需要申请内存的大小。~((size_t) _ALIGN - 1))得到的值是~7,用二进制表示就是11111111 11111111 11111111 11111000,用一个数&上~7,就可以确保低三位必定为0,高三位以上的1都会保留,就可以确保得到的数必定是8的倍数。
我们需要的是提升到8的倍数,7的二进制是111,如果__bytes的低三位有1,就会满8进1,多余的1就会在和11111111 11111111 11111111 11111000时过滤掉,所以需要加上7。
复杂的位操作让我们搞不清这个函数要干什么,其实我们可以把这个表达式替换成±*/%组成的表达式,只是在计算机中位操作比四则运算效率要高,这个表达式等价于
static size_t _S_round_up(size_t __bytes)
{
return (__bytes + _ALIGN - 1) / _ALIGN * _ALIGN;
}
这个表达式就可以很清晰的表达这个函数想要的结果,举几个例子就可以明白这个函数的功能。
测试代码:
#include <iostream>
using namespace std;
enum{
_ALIGN =8 };
static size_t _S_round_up1(size_t __bytes)
{
return (((__bytes)+(size_t)_ALIGN - 1) & ~(_ALIGN - 1));
}
static size_t _S_round_up2(size_t __bytes)
{
return (__bytes + _ALIGN - 1) / _ALIGN * _ALIGN;
}
int main()
{
for (int i = 0; i <= 128; i++)
{
cout << i << " " << _S_round_up1(i) << " " << _S_round_up2(i) << endl;
}
return 0;
}

_S_freelist_index函数分析
static size_t _S_freelist_index(size_t __bytes) {
return (((__bytes) + (size_t)_ALIGN-1)/(size_t)_ALIGN - 1);
}
申请内存时,自由链表取下一个内存块,而自由链表维护的chunk块是按8字节对齐的,在申请时会对大小进行提升,在归还chunk块时也要归还到对应大小chunk块的下标。这个函数的功能就是用来定位__bytes大小的内存chunk块在自由链表对应的下标的。
边栏推荐
猜你喜欢
随机推荐
IDEA设置System.out.println()和main方法快捷键
ES:解构
test4
【科普向】5G核心网架构和关键技术
2022年施工企业数字化转型思考,施工企业数字化转型之路
潜心打磨,主动求变——这群技术排头兵,如何做好底层开发这件事?
typescript2-typescript为什么给js添加类型支持
Lenovo Notebook How to Change Windows 10 Boot Logo Icon
【Kotlin 中的类和继承】
Alibaba Cloud Cloud Server Firewall Settings
动态规划专栏
leetcode力扣——一篇文章解决多数之和问题
风靡全球25年的重磅IP,新作沦为脚本乐园
cmd命令
What convenience does the RFID fixed asset inventory system bring to enterprises?
MagicDraw secondary development process
手把手教学OneOS FOTA升级
英语语法-名词性从句
MySql Detailed Basics
C语言力扣第46题之全排列。回溯法









