[英]How to completely manage heap memory allocation of std containers like map?
我對使用多個std map <int,int>感興趣,我希望所有這些都能從公共內存池中分配元素。 從我到目前為止所讀到的,我可以使用自定義分配器,如Boost pool_alloc來實現這一點。
我的問題是,盡管使用像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 :: allocator符合的分配器(例如boost :: pool_allocator)都以以下形式提供重新綁定模板結構:
template<class U> struct rebind{
typedef AllocatorType<U> other;
};
這可用於為不同類型獲取相同類型的分配器:
typedef AllocatorOfOther AllocatorType::rebind<ADifferentType>::other;
gcc std :: map內部結構
g ++ std :: map實現(我檢查過4.7.3和4.1.1)完全是由單個節點類型構建的。 這包括鍵值對以及rbTree結構所需的指針和顏色位。 為了分配它,它使用來自用戶提供的分配器的重新綁定結構來定義節點分配器。 這用於地圖增長時它所做的所有分配。 每個新節點都在一次分配中分配。
標准
我檢查了C ++ 11標准,但找不到任何指定如何分配這種結構的內容。 要么我找不到合適的部分,要么沒有指定。 不使用給定分配器類型的用戶似乎有點無意義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.