2016-12-30 168 views
1

在C++ 11中,2D矢量在時間上如何對抗1D矢量?
在給出的2D矢量中,所有內部矢量的大小相同。2D矢量vs 1D矢量

例:

std::vector<std::vector<int>> X{10, std::vector<int>(4)}; 

VS

std::vector<int> Y(40); 

哪個頭像載體將有更好的表現,當元素是隨機訪問?

+6

與任何時間測量一樣,您必須在您關心的系統上進行測量。 – merlin2011

+0

@ merlin2011我想知道,與1D相比,C++優化2D矢量有什麼不同。我很擔心,因爲我的少數人運行,而不是C++ 11的專業知識可能最終導致我錯誤地採取了一些措施。 – letsBeePolite

+1

任何性能測量的第一條規則是第一次測量總是錯誤的。但這就是爲什麼我們繼續測量,直到我們有理由有信心。 :P – merlin2011

回答

5

一個單一的std::vector本質上更簡單,它只是一個連續的內存塊存儲在某個地方。

A std::vector of std::vector有更多的開銷,但它也更強大(因爲每個內部向量可以是不同的大小,例如)。

隨機訪問性能應徹底基準爲使用您的具體模式,但主要區別在於:

  • 單矢量你剛纔計算size_t index = x + y*WIDTH和訪問元素
  • 嵌套向量你有兩個間接級別,首先你必須獲得包含內部向量的內存,然後你必須獲得內部向量數據的內存。
+0

是的,額外的間接訪問級別會導致額外的內存訪問,這會減慢速度,有時候會影響現代系統中的大型因素。在現在的古老CPU上,額外的間接尋址有時可能會更快,因爲相對於存儲器訪問,乘法可能相當耗時。人們有時看到20年前寫的代碼就是這樣做的。除非需要可變的行大小,否則這些日子通常是不好的做法 – doug

+0

如果您在編譯時知道任何內部或外部大小,請使用'std :: array ,4>'。如果你真的在表演之後,你可以有一個新的矩陣類型,或者作爲一個獨立的類型,或者來自或構建'std :: vector '。如果你打算做後者,請閱讀這[鏈接](http://stackoverflow.com/questions/4353203/thou-shalt-not-inherit-from-stdvector)。 – NameRakes