2010-12-14 40 views
10

看看vector,我意識到我在創建向量時從未使用過第二個參數。std :: vector的第二個參數

std::vector<int> myInts; // this is what I usually do 
std::vector<int, ???> myOtherInts; // but is there a second argument there? 

在鏈路上面看它說這是:

分配器對象來代替構造一個新的。

,或者作爲用於this one

分配器:用於定義存儲分配模型中的分配器對象的類型。默認情況下,使用類型爲T的分配器類模板,它定義了最簡單的內存分配模型,並且與值無關。

我想它與內存管理有關。但是,我不知道如何使用它。

有關這方面的任何指針?

+0

這是定義你的OWM分配器的例子:http://stackoverflow.com/questions/3984588/c-stl-vector-reserve/3984720#3984720 – 2010-12-14 08:08:32

+0

@skwllsp:這看起來很有趣。你想讓我高興還是要去找無名英雄徽章? :) – Default 2010-12-14 08:12:13

+2

我忘了補充一點。當我必須找到我的容器消耗了多少內存時,我使用了自己的分配器。我寫了一點點lenghty答案:http://stackoverflow.com/questions/2160300/how-to-find-the-memory-used-by-any-object/2160786#2160786 – 2010-12-14 08:18:42

回答

4

默認分配器std::allocator<>將處理由std::vector<>(和其他人)做出的所有分配。每次需要新分配時,它都會從堆中分配新分配。

通過提供自定義分配器,您可以先分配一大塊內存,然後將其分片,然後在需要單獨分配時分配較小的塊。這將大大提高分配速度,這在例如遊戲中是有好處的,但與缺省分配器相比,這會增加複雜性。

某些std類型實現具有用於少量數據的內部基於堆棧的存儲。例如,std::basic_string<>可能會使用所謂的小字符串優化,其中只有長於某個固定長度的字符串(例如16個字符(僅舉例!))從分配器獲取分配,否則使用內部數組。

+0

但在'std ::矢量','int's不會堆棧? – Default 2010-12-14 08:14:04

+0

@Default - no。 std :: vector(默認情況下)在堆上分配其存儲空間。 – atzz 2010-12-14 08:19:24

+0

@Default:請參閱我的補充關於*小字符串優化*。 – 2010-12-14 11:26:38

1

Allocators (STL)幫助您管理矢量類中的對象的內存。你可以爲不同的內存模型(等)使用自定義分配器。

2

自定義分配器在一般情況下很少使用。一些可用的示例:

  • 針對特定分配模式的優化。例如,一個併發程序可以在任務執行開始時通過標準方式預分配一大塊內存,然後在不阻塞全局堆互斥的情況下刪除它。當任務完成時,整個內存塊可以被丟棄。要在STL容器中使用這種技術,可以使用自定義分配器。嵌入式軟件,其中設備具有不同屬性(緩存/非緩存,快/慢,易失性/永久性等)的多個內存範圍。自定義分配器可用於將存儲在STL容器中的對象放置在特定的內存區域中。

+0

所以基本上,我不妨忽略它,直到我需要擔心內存管理:) – Default 2010-12-14 09:17:38

+0

@默認 - 基本上,是的。另一方面,當將STL容器模板作爲*模板模板參數*傳遞給其他模板時,可能必須考慮第二個參數的存在。但通常情況並非常見。 :) – atzz 2010-12-14 09:23:43

相關問題