最近在看侯捷老師寫的stl原始碼剖析,想通過看優秀的**來提高自己的程式設計水平。
首先stl提供了六大元件,彼此可以套用使用。
借助一張從書上截的圖來表明:
container通過allocator來獲取資料儲存空間
algorithms通過迭代器來獲取container的內容,functors可以協助algorithms完成不同策略變化
adapter可以修飾或者套接functor由此可見在stl中空間配置器是非常重要的。
簡單分析下為什麼需要使用空間配置器?
使用空間配置器的原因就是為了解決外碎片
而且我們在使用stl容器的時候,比如vector我們可能需要不斷的去申請記憶體,頻繁的申請小塊記憶體效率是非常低的。而stl是非常重視效率的,因此就有了空間配置器來解決這個問題。
stl空間配置器的框架設計
首先設計一級空間配置器
它使用了 __malloc_alloc_template乙個模板類來實現一級空間配置器的功能,在這裡我可以根據stl給出的簡單的模擬實現它,通過這種方式來了解它到底是如何實現的。
typedef
void(*handle_func)();//handle_func代表乙個函式指標
template
class __malloc_alloc_template
//使用者來設定控制代碼,但是不建議,容易陷入死迴圈
static
void* oom_malloc(size_t size)
_handle();//如果設定了控制代碼,那麼就會一直迴圈,直到申請到了,才會退出
void *ret = malloc(size);
if (ret)}}
static
void* allocate(size_t size)//直接呼叫malloc
}static
void deallocate(void* p, size_t n)//釋放一級空間配置器申請的記憶體
private:
static handle_func _handle;
};
上述就是簡單的一級空間配置器的設計,當然stl設計的還有realloc在這裡我只是簡單的模擬實現以下,沒有寫realloc;
二級空間配置器的設計相較於一級空間配置器的實際就複雜一些
他申請記憶體並不是直接先問系統索要見下圖的過程:
小細節:
if (left_bytes>n)//說明記憶體池中不足n*njobs個位元組,但是足夠n個
else
//說明記憶體池中連n個都不夠
//說明要為狹義記憶體池分配空間了
size_t bytetogets = total_bytes * 2 + round_up(_heapsize >> 4);
//__trace_debug("到系統申請%u bytes給memory pool\n", bytetogets);
_startfree = (char*)malloc(bytetogets);
if (_startfree == null)//說明記憶體已經吃緊,到更大的自由鍊錶中去獲取空間
}//如果還是沒有分配到記憶體,也不要灰心,繼續呼叫一級空間配置器
_startfree = (char*)__malloc_alloc_template<0>::allocate(bytetogets);
}//說明一定分配記憶體成功了
_heapsize = _heapsize + bytetogets;
_endfree = _startfree + bytetogets;
return chunk(n, nobjs);}}
static
void* allocate(size_t n)
//__trace_debug("呼叫二級空間配置器申請%u bytes\n", n);
size_t index = freelist_index(n);//計算在自由鍊錶下對應的下標
if (_freelist[index])//說明自由鍊錶不空
//說明自由鍊錶對應的位置沒有儲存空間,此時我們需要去問記憶體池索要;
else
}static
char* refill(size_t n)//實際上返回我們需要的,並且將剩餘的掛在相應的自由鍊錶下面
else
cur->free_list_link = null;
return ret;}}
static
void deallocate(void* ptr, size_t n)
else
//並沒有真正的釋放,而是掛在了自由鍊錶下面
}private:
enum ;
enum ;
enum ;
union obj ;//管理自由鍊錶
//狹義記憶體池
static obj*_freelist[__nfreelists];
static
char*_startfree;
static
char*_endfree;
static size_t _heapsize;
};
STL之空間配置器
空間配置器allocator負責空間的配置和管理,是一種實現了動態空間配置 空間管理 空間釋放的class template。1.空間配置器的標準介面 allocator value type allocator pointer allocator const pointer allocator r...
STL之空間配置器
pragma once include 為了malloc free include define throw bad alloc std cerr class onespce 對free的封裝 static void deallocate void p,size t n 這個size t完全可以不要...
STL 空間配置器
stl有6大元件 容器 演算法 迭代器 仿函式 配接器 分配器。它們之間的密切關係是stl的精髓所在,容器用來存放資料,而容器存在的前提是要有分配器給它分配記憶體,接下來需要實現演算法,迭代器便作為演算法來對容器資料操作的橋梁,演算法可以使用仿函式完成不同的策略變化,配接器可修飾或套接仿函式。說了麼...