2014-02-12 109 views
2

我正在寫簡單的模板,矢量風格的類,我想知道,哪種方式更好 - 收集普通數組或指針數組中的元素? 第二種方法應該確保更快地複製數組,但需要更多的指針內存。C++風格的矢量 - 指針數組還是數組?

對嗎?是否有其他性能後果?

+0

如果我要使用你的數組作爲Vector ,我希望複製該向量以複製其所有T元素。您可以在內部選擇存儲空間,但只複製指針會更快,但不會像預期的那樣運行。 –

+0

沒有普遍的答案。性能差異將取決於元素的種類:它們的大小是否相等?他們是小指針嗎?他們真的很大嗎? – Wolf

回答

1

我正在寫簡單的模板,矢量風格的類,我想知道,哪種方式更好 - 收集普通數組或指針數組中的元素?

全部std::vector<>實現選擇「正常數組」 - 一個連續的元素分配。在考慮性能之前,考慮你需要的語義。

使用指針會使您的實現變得非常複雜。此外,它會打破std::vector<>的元素連續分配的保證。

使用指針意味着更多的簿記。此外,它還需要額外的分配以保持和間接。簡單類型的簡單結構可以更快地複製,儘管使用底層指針有一些優點。一般來說,您應該將連續分配視爲默認設置。如果您發現指針大有好處,請以另一種類型使用它。

還要注意像移動和交換這樣的向量操作可以通過交換指向數組的指針來實現,因此您可以爲某些操作指定速度。

現有的矢量設計是一個非常好的起點。

連續分配的最大好處是在緩存上很容易。內存讀取和寫入比分散在各地的元素內存要快得多。

另一點:指針的大小可以大於一個值/元素。在這種情況下,使用指針可以增加內存需求。

第二種方式應該確保更快地複製數組,但需要更多的指針內存。

是怎麼回事?您仍然需要複製元素並跟蹤其生命週期以獲取正確的語義。在這種情況下,如果你的意圖是分享向量的元素,那麼簡單的shared_ptr向量就是一個值得考慮的方法。一般來說,shared_ptr應該用得很少,所以你可能想重新考慮你的設計。使用std::vector<>的設計作爲出發點絕對沒有錯,因爲它是一個很好的默認設置。

1

你爲什麼現在擔心表現?另外,一個普通的(C風格)數組必須具有編譯時的大小,而且也不需要任何fanc內存管理,所以你真的沒有多少選擇。

此外,複製速度如何與底層數據相關?如果有N個字節,則任何一種方式都需要複製N個字節。

+0

+1。複製N個字節並且分散到整個地方比較容易。 – juanchopanza

+0

我正在寫動態分配數組。只是不知道這應該是'(T **)'還是'T *'。 –

+0

@Krzysztof:它應該是'std :: unique_ptr '。 – rubenvb

0

看來你想實現自己的矢量模板?不要這樣做,請使用已有的STL containers之一。

很多工作要做不僅僅是評估指針與平面數據決定「性能」的相關性。