问一个关于SGI STL内存管理的问题

外面的风景 2014-10-01 09:25:30
最近在看侯捷的《STL源码剖析》,最alloc里面的free_list有很多疑问
1、关于free_list

union obj {
union obj* free_list_link;
char client_data[1];
};
static obj* volatile free_list[16];

定义中的client_data有什么用?谁能讲解一下这样使用union的好处在哪里?

2、在allocate的时候,第一次分配会调用refill分配20个相应大小的内存块给*free_list
但是我自己写了一个test.cpp,先分配大小为16的内存,因为刚开始free_list[1]为空,所以应该会调用refill函数给free_list[1]分配20个大小为16的内存块,于是我想要看看究竟分配了多少

int main()
{
alloc* ptr = new alloc; //sgi stl的内存配置器
int sum = 0;
char* cptr1 = (char* )ptr->allocate(16); //分配内存
for (int i = 0; i < __NFREELISTS; i++)
if (ptr->free_list[i] != 0) //大小为16对应free_list[1]
{
alloc::obj* p = ptr->free_list[i];
while(p->free_list_link != NULL)
{
sum++;
cout << p << endl;
p = p->free_list_link;
}
cout << sum << endl;
}
return 0;
}

输出的结果sum为18,为什么不是20呢?
...全文
166 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
外面的风景 2014-10-03
  • 打赏
  • 举报
回复
引用 2 楼 lovesmiles 的回复:
使用union的好处是,如果这块内存还没有被使用,可以将它当作一个指针来使用,指向下一个空内存块。假如这块内存块已经被使用,直接将它当client_data来使用。这样就省了一个指针。使得这块内存可以起两个作用。闲时当指针,忙时当数据。
是不是可以这样理解,这个内存块存放的东西在运行时决定,如果访问obj->free_list_link这块内存就存放一个指针,如果访问obj->client_data这块内存就存放一个数据?
勤奋的小游侠 2014-10-02
  • 打赏
  • 举报
回复
使用union的好处是,如果这块内存还没有被使用,可以将它当作一个指针来使用,指向下一个空内存块。假如这块内存块已经被使用,直接将它当client_data来使用。这样就省了一个指针。使得这块内存可以起两个作用。闲时当指针,忙时当数据。
外面的风景 2014-10-01
  • 打赏
  • 举报
回复
第2个自己搞懂了。。应该从1开始算,因为已经分配了一块给cptr1所以又少了1,所以只有18了

64,637

社区成员

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

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