2010-12-10 74 views
0

是否有一個容器僅對少數元素使用本地緩衝區,並且僅在元素數量超過某個限制時才使用堆分配?類似於大多數std::string實現。帶有堆棧和動態分配的容器


背景

該容器在以下的(簡化的)上下文中使用:

Foo foo;      // some data 
vector<HandlerPtr> tagged; // receives "tagged" items 

// first pass: over all items in someList 
for each(HandlerPtr h in someList) 
{ 
    h->HandleFoo(foo);   // foo may become tagged or untagged here 
    if (foo.Tagged()) 
    tagged.push_back(h); 
} 
for(auto itr=tagged.rbegin(); itr!=tagged.end(); ++itr) 
{ 
    // ... 
} 

該代碼部分具有高調用頻率,但是標記的項目是相當罕見的,數someContainer中的項目通常較低,但是沒有約束。我無法輕鬆使用預分配的「更全局」緩衝區。目標是避免頻繁分配。


調用頻率

  • 常見:沒有項目成爲標記。 std :: vector很好
  • 常見:只有少數項目中的一個被標記。導致高頻率分配我想避免
  • 非常罕見,但必須得到支持:第一遍時someList增長,項目數量無法預測,但仍處於低位
+0

你想使用靜態或堆棧分配?對於堆棧分配,請參閱http://stackoverflow.com/questions/354442/looking-for-c-stl-like-vector-class-but-using-stack-storage – nimrodm 2010-12-10 07:20:46

+0

@nimrodn:堆棧分配可能是一個更好的描述我想要(固定標題)。即可以存儲在容器實例中的有限數量的元素(不需要額外的分配),並且如果不足夠使用堆分配。 – peterchen 2010-12-10 11:39:40

+0

在插入至少一個元素之前`std :: vector`不分配任何內存。 – 2010-12-10 16:14:46

回答

3

沒有這保證了這種行爲的標準集裝箱。然而,如果你願意,你可以創建一個自定義的STL兼容的分配器類,該分配器從一個小的堆棧緩衝區中獲取小的分配,並且只在請求的分配大小超過堆棧緩衝區的大小時才執行堆分配。您可以插入您的自定義分配器類作爲std::vector<T, Alloc>的第二個模板參數。

有關創建自定義分配器的信息,應該閱讀this article

0

雖然不能保證這一點,最std::string將實行Small String Optimization,這僅僅是(用VC++ 10多達8個或16個字符正是如此存儲)

我還沒有看到vectors做,總是想知道爲什麼,但即將推出的C++標準將通過std::aligned_storagealignof來實現。這樣我們就能夠正確地對齊原始內存並用一些默認的「堆棧」內存構建容器。