首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于STL allocate()函数

2012-10-05 
关于STL allocate()函数求助!最近我在看侯捷先生的《STL源码剖析》这本书,也许是我理解能力有点问题,有些看

关于STL allocate()函数求助!
最近我在看侯捷先生的《STL源码剖析》这本书,也许是我理解能力有点问题,有些看不懂,所以过来求助,
请路过的大侠帮个忙,先谢谢了!!
1.这个 my_free_list = free_list + FREELIST_INDEX(n); 这句完成了什么事情?
2.仅仅是完成了移动所需内存空间的指针的位置么?
3.最后得到的 my_free_list 这个是指向从free_list开始到 FREELIST_INDEX(n)这个索引处的内存么?
4.最后进行的 *my_freelist = result->free_list_link 这句,完成了什么动作?free_list的状态与开始相比有什么变化?

C/C++ code
 /* n must be > 0      */  static void * allocate(size_t n)  {    obj * __VOLATILE * my_free_list;    obj * __RESTRICT result;    if (n > (size_t) __MAX_BYTES) {        return(malloc_alloc::allocate(n));    }    my_free_list = free_list + 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    result = *my_free_list;    if (result == 0) {        void *r = refill(ROUND_UP(n));        return r;    }    *my_free_list = result -> free_list_link;    return (result);  };




[解决办法]
我猜 free_list 是一个指针数组 void*[],其中每一个元素指向一系列大小一样的内存块,FREELIST_INDEX(n) 给出下一个大小比 n 大的内存块在 free_list 数组中所在的位置。如果该位置还没有记录任何已经分配的内存块地址,则它记录的肯定是一个空地址。因此,如果是空地址,那么就现场分配大小为 ROUND_UP(n) 的内存,并将其加入到 free_list 对应的位置。
[解决办法]
探讨

我猜 free_list 是一个指针数组 void*[],其中每一个元素指向一系列大小一样的内存块,FREELIST_INDEX(n) 给出下一个大小比 n 大的内存块在 free_list 数组中所在的位置。如果该位置还没有记录任何已经分配的内存块地址,则它记录的肯定是一个空地址。因此,如果是空地址,那么就现场分配大小为 ROUND_UP(n) 的内存,并将其加入到 free_list 对应的……

[解决办法]
探讨

我猜 free_list 是一个指针数组 void*[],其中每一个元素指向一系列大小一样的内存块,FREELIST_INDEX(n) 给出下一个大小比 n 大的内存块在 free_list 数组中所在的位置。如果该位置还没有记录任何已经分配的内存块地址,则它记录的肯定是一个空地址。因此,如果是空地址,那么就现场分配大小为 ROUND_UP(n) 的内存,并将其加入到 free_list 对应的……

热点排行