2015-08-31 44 views
1

我有一個關於在C++中使用的向量的問題。我知道與數組不同,向量沒有限制。我有一個有600萬頂點的圖,我正在使用類的向量。當我嘗試向節點中插入節點時,它說失敗的內存分配失敗。因爲它可以完美地運行超過200萬個節點。我知道不好的分配意味着它由於我在我的代碼中使用的指針而失敗,但對我來說似乎並不是這樣。我的問題是,由於矢量的限制增加,由於圖的大尺寸,它可能失敗。如果有任何方法,我們可以增加該限制。在C++中限制向量

+5

對於64位編譯器使用64位系統,並且您的限制實際上會消失。當然,如果您嘗試使用比系統中安裝的內存多的內存,事情會顯着減慢。 –

+1

你能告訴我們你正在使用哪些代碼將項目添加到向量中,特別是引發異常的部分? – Xirema

+1

檢查'std :: vector :: max_size()' –

回答

1

std::vector::max_size,您可以使用它來查看您聲明的矢量可能容納的元素的最大數量。

返回最大尺寸

返回的 載體可以容納的元素的最大數量。

這是最大的潛在規模的容器可以達到由於 已知的系統或庫實施限制,但容器 是沒有保證能夠達到這個規模手段:它仍然可以 失敗在達到該大小之前的任何時間點分配存儲空間。

3

首先,您應該驗證單個元素需要多少內存。一個頂點/節點的大小是多少? (您可以通過使用sizeof運算符來驗證)。考慮如果答案是50字節,則需要50個字節乘以600萬個頂點= 300兆字節。

然後,考慮下一個問題:在一個向量中,內存必須是連續的。這意味着你的程序會要求操作系統給它一個300 MB的連續塊,並且不能保證這個塊可用,即使可用內存超過300 MB。您可能必須拆分數據,或者選擇另一個不連續的容器。內存碎片是不可能控制的,這意味着如果你運行你的程序並且它工作正常,也許你再次運行它並且它不起作用(反之亦然)。

另一種可能的方法是手動調整矢量大小,而不是讓它自動選擇新的大小。該向量試圖預測未來的一些增長,所以如果它需要增長,它會嘗試分配更多的容量。這種額外的容量可能是有足夠的內存和沒有足夠的內存之間的差異。你可以使用std::vector::reserve來實現這一點,儘管我認爲確切的行爲是依賴於實現的 - 它可能仍然決定保留超過你請求的數量。

您還有一個選擇是優化您使用的數據類型。例如,如果在頂點類中使用32位整數,而只需要16位,則可以使用int16_t,這將佔用一半的空間。請參閱CPP Reference的固定大小變量的完整列表。