剖析SGI STL空间配置器(核心设计:_S_chunk_alloc函数)
_S_chunk_alloc函数是chunk内存块的内存源头。当申请某个自由链表结点下的chunk块不足时,就会调用_S_refill函数来补充chunk块,而填充内存的来源,就是通过_S_chunk_alloc函数申请的。
_S_chunk_alloc函数的设计可以说是二级空间配置器最精妙的设计了。来看它的定义:
template <bool __threads, int __inst>
char*
__default_alloc_template<__threads, __inst>::_S_chunk_alloc(size_t __size,
int& __nobjs)
{
char* __result;
size_t __total_bytes = __size * __nobjs;
size_t __bytes_left = _S_end_free - _S_start_free;
if (__bytes_left >= __total_bytes) {
__result = _S_start_free;
_S_start_free += __total_bytes;
return(__result);
} else if (__bytes_left >= __size) {
__nobjs = (int)(__bytes_left/__size);
__total_bytes = __size * __nobjs;
__result = _S_start_free;
_S_start_free += __total_bytes;
return(__result);
} else {
size_t __bytes_to_get =
2 * __total_bytes + _S_round_up(_S_heap_size >> 4);
// Try to make use of the left-over piece.
if (__bytes_left > 0) {
_Obj* __STL_VOLATILE* __my_free_list =
_S_free_list + _S_freelist_index(__bytes_left);
((_Obj*)_S_start_free) -> _M_free_list_link = *__my_free_list;
*__my_free_list = (_Obj*)_S_start_free

本文解析了SGISTL中关键的内存管理函数_S_chunk_alloc,它在内存不足时的高效策略和备用池管理。通过实例阐述了内存分配、备用池补充和异常处理的过程,展示了二级空间配置器的巧妙设计。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



