[英]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())
不幸的是,簽名被上面的構造函數占用。 任何其他可能的簽名都可能導致問題 例如
vector(size_type count, size_type reserve_count)
將與T(size_type)
向量的上述n重復元素構造函數沖突。
vector(size_type count, const T& value = T(), size_type reserve_count)
是一種可能的解決方案,但它太長而且仍然很無聊。 我們需要在調用auto v = vector<T>(0, T(), reserve_count)
構造一個我們從不使用的默認值
其他可行方案:
提供類似make_pair / make_unique的函數。
定義一個從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.