簡體   English   中英

如何在施工時為std :: vector保留內存?

[英]How do I reserve memory for a std::vector at construction time?

通常我在構造它之后立即調用std::vector上的reserve 這通常不會導致std::vector的現有堆分配被銷毀並替換為新的堆分配嗎? 有沒有辦法在構建時保留內存而不是分配堆空間然后立即銷毀它? 或者是否在std::vector有一個實現技巧來確保這不是問題?

可用的構造函數似乎只能用於使用值填充std::vector ,而不是顯式保留空間。

您的問題基於一個錯誤的前提,即默認構造的std::vector<T>將執行[零長度]分配。

實際上沒有理由這樣做。 一個新的向量應該具有容量(雖然這是理智所要求的,而不是標准所要求的)。

因此,您的目標已經天生就滿足了。

說實話,標准庫並不是那么愚蠢。

如果您在編譯時知道元素的數量,則可以使用以下元素列出初始化向量:

 class MyClass 
 {
      int x, y, z;
      std::vector<int> v;

  public:
         MyClass(int X, int Y, int Z) : x(X), y(Y), z(Z), v{x, y, z}
         {}
 };

但這不是很好維護。 有更多高級技術,例如自定義分配器,你可以使std::vector使用它可以從預先分配的內存池中獲取內存,例如:我懷疑你真的需要它,但是。 現代實現可以輕松優化這么簡單的問題。

原因可能是具有諷刺意味的,我們的功能簽名已經用完了。

要求來自使用場景,我們確切地知道我們將保存到向量中的元素數量,但我們真的不喜歡n重復元素構造函數:

std::vector( size_type count, const T& value = T())

不幸的是,簽名被上面的構造函數占用。 任何其他可能的簽名都可能導致問題 例如

  1. vector(size_type count, size_type reserve_count)將與T(size_type)向量的上述n重復元素構造函數沖突。

  2. vector(size_type count, const T& value = T(), size_type reserve_count)是一種可能的解決方案,但它太長而且仍然很無聊。 我們需要在調用auto v = vector<T>(0, T(), reserve_count)構造一個我們從不使用的默認值

其他可行方案:

  1. 提供類似make_pair / make_unique的函數。

  2. 定義一個從Allocator派生的Reserver,所以我們可以使用構造函數向量(const Allocator&alloc)之類的

auto v = vector<Type>(new Reserver(reserve_count));

對象std::vector及其元素數組不存在於同一個連續的內存塊中,否則每次調整數組大小時其地址都會發生變化,從而無法保持對它的可靠引用。 對象的主體僅包含控制變量和指向實際數組的指針,它將在堆棧中實例化(假設您將其用作局部變量)以及其他局部變量。 此時數組將為空,可能由指向nullptr的指針表示。 因此,如果您在構造時間或之后reserve ,則無關緊要,將不會發生重大優化。

如果你想要一個靜態保留的靜態大小的std::vector ,你可以使用常規的C數組而不是std::vector 只要確保它適合堆棧。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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