关于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 对应的位置。
[解决办法]
[解决办法]