簡體   English   中英

如何完全管理像map這樣的std容器的堆內存分配?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM