我對使用多個標準地圖感興趣< int,int >我希望所有人都從一個公共內存池中分配元素。從我目前閱讀的內容來看,我可以使用自定義分配器(例如Boost pool_alloc)來實現此目的。如何完全管理像地圖一樣的std容器的堆內存分配?
我的問題是,儘管使用像Boost pool_alloc來管理元素本身的分配,std map仍然會使用堆內存的一小部分作爲某種形式的容器開銷,不會由boost pool_alloc管理?我正在考慮一些關於使用std映射本身的指向元素的指針?
我對使用多個標準地圖感興趣< int,int >我希望所有人都從一個公共內存池中分配元素。從我目前閱讀的內容來看,我可以使用自定義分配器(例如Boost pool_alloc)來實現此目的。如何完全管理像地圖一樣的std容器的堆內存分配?
我的問題是,儘管使用像Boost pool_alloc來管理元素本身的分配,std map仍然會使用堆內存的一小部分作爲某種形式的容器開銷,不會由boost pool_alloc管理?我正在考慮一些關於使用std映射本身的指向元素的指針?
短版
地圖類型,如:
typedef std::map<
int,
int,
less<int>,
boost::pool_allocator<pair<const int, int> >
>
AMapType;
將盡一切需要,因爲它生長使用boost :: pool_allocators分配。一些初始結構可能會在堆棧上創建。多少,什麼確切的結構將取決於實施。
分配器重新綁定
上面能夠通過使用allocator::rebind
所有的std ::分配器符合的分配器(諸如升壓:: pool_allocator)提供形式的重新綁定模板結構:
template<class U> struct rebind{
typedef AllocatorType<U> other;
};
這可以被用於獲得相同種類的分配器用於不同類型:
typedef AllocatorOfOther AllocatorType::rebind<ADifferentType>::other;
GCC的std ::映射內部結構
的克++的std ::映射實現(I檢查4.7.3和4.1.1)純粹是內置了單個節點的類型。這包括關鍵值對以及rbTree結構所需的指針和顏色位。爲了分配它,它使用來自用戶提供的分配器的rebind結構定義一個節點分配器。這用於地圖增長時的所有分配。每個新節點都被分配到一個分配中。
標準
我檢查雖然C++ 11標準,找不到任何指定這樣的結構應該如何分配。要麼我找不到合適的部分,要麼沒有指定。不使用給定分配器類型的用戶似乎沒有意義。
你問一個包含指針的容器嗎?對不起,但我不明白... – Stefan
@Stefan:不,不是包含指針的容器。鑑於自定義分配器將負責分配元素本身,我問是否所有容器內存開銷的std :: map也將由自定義分配器覆蓋。我希望這有助於澄清我的問題 – polemic
好的。瞭解。沒有。具體的分配器負責爲堆中的特定元素分配空間,而不是爲容器本身分配空間。如果你想改變,你需要重載運算符新/刪除您的特定容器。 – Stefan