有关 SGI STL内存池的一个小疑问

高性能架构探索 2011-03-02 03:17:15
代码如下:
跟源码稍微有所不同,但意思一样

void* mem_pool::allocate(size_t n)
{
obj** my_free_list;
obj* result;

if(n <= 0)
return NULL;
// 如果要分配的内存大于MAX_BLOCK_SIZE, 直接调用malloc分配内存
if(n > MAX_BLOCK_SIZE)
return malloc(n);

try
{
// 获得尺寸n的HASH表地址
my_free_list = free_list + free_list_index(n);
result = *my_free_list;

if(NULL == result)
{
// 如果之前没有分配, 或者已经分配完毕了, 就调用refill函数重新分配
// 需要注意的是, 传入refill的参数是经过对齐处理的
result = (obj *)refill(round_up(n));
}
else
{
// 否则就更新该HASH表的LIST头节点指向下一个LIST的节点, 当分配完毕时, 头结点为NULL
*my_free_list = result->free_list_link;//mark,这块怎么个更新法,不是退出函数作用域的时候,my_free_list不是已经被释放了么,如果再进入这个函数,不是又重新开始么?我没看出来更新HASH表来
}
}catch(...){
result = NULL;
}

return result;
}

...全文
76 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
呵呵,明白了,谢谢楼上

因为毕业设计,搞的很多东西都忘了,忘了my_free_list是个二重指针了...
pengzhixi 2011-03-02
  • 打赏
  • 举报
回复
第2个桶现在变成了第1桶了。就是说free_list + free_list_index(n);
这个位置上有7个8字节的内存连接在一起,之前分配出一个,现在还剩6个了,就从剩下的6个里面继续分配就是了。
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pengzhixi 的回复:]
*my_free_list = result->free_list_link;

额 这里实际上是将result这个刚刚分配的内存从*my_free_list这个链条上分离出来,result->free_list_link;就是result这段内存的下一个内存节点。
[/Quote]
这个我明白,可能我说的不清楚吧
我想知道的是:
比如我们要分配8个字节,那么首先
比如把第一个桶分配出去了,现在my_free_list指向第二个桶,但是函数结束的时候,如果下一次再一次进入这个函数,执行下面的语句:
my_free_list = free_list + free_list_index(n);
result = *my_free_list;
my_free_list仍然指向的是第一个桶,何来第二个桶呢,第一个桶刚才不是已经被分配了么?
pengzhixi 2011-03-02
  • 打赏
  • 举报
回复
*my_free_list = result->free_list_link;

额 这里实际上是将result这个刚刚分配的内存从*my_free_list这个链条上分离出来,result->free_list_link;就是result这段内存的下一个内存节点。
  • 打赏
  • 举报
回复
*my_free_list = result->free_list_link;
或者说在函数结束的时候,谁来记录在free_list[10]中第一块可分配的内存地址?
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qq120848369 的回复:]
你这是完全不懂,这个链表叫索引链表,每个结点对应一个自由链表桶.

my_free_list = free_list + free_list_index(n); 对应到索引链表的某个桶

result = *my_free_list; "取出"获取桶中第一个内存块的地址

*my_free_list = result->free_list_link; "取走"桶中第一个内存块,并让ne……
[/Quote]
你说的我知道,恰恰我想知道你没回答我...
我想知道的是,又不是每一个桶都有一个my_free_list,即使在size=8处更新了,那么下次如果size=16时分配后,那岂不是在size=8处的又没有记录么?
qq120848369 2011-03-02
  • 打赏
  • 举报
回复
你这是完全不懂,这个链表叫索引链表,每个结点对应一个自由链表桶.

my_free_list = free_list + free_list_index(n); 对应到索引链表的某个桶

result = *my_free_list; "取出"获取桶中第一个内存块的地址

*my_free_list = result->free_list_link; "取走"桶中第一个内存块,并让next作为桶中第一个内存块.

64,663

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧