所以std :: array和boost :: array(幾乎是相同的,我將在下文中將其簡稱爲「數組」)被設計爲爲數組提供一個容器對象,而不會產生向量的開銷如果數組不動態更改大小,則不必要。但是,它們都是通過將數組大小不作爲構造函數參數而設計爲模板參數來設計的。結果是:向量允許在創建對象後進行動態調整大小;數組需要在編譯時知道大小。我可以看到,如果你有一個數組,你會知道它在創建對象時的大小,而不是在編譯時,那麼你唯一的選擇是1)通過使用向量不必要地招致額外的開銷,2)使用(非容器類型)本地數組(例如,int foo[42];
),或3)從頭編寫自己的數組包裝類。所以這是正確的,這是一個介於兩者之間的情況,你可能想使用數組而不是矢量,但不能?還是有一些我可以做的魔術,可能會爲我工作?在這種情況下可以使用std :: array(或boost :: array),還是我堅持使用std :: vector和native數組?
這裏有一個小細節(好吧,很多)上有什麼啓發了這個問題,在情況下,它可以幫助你理解:
我有一個模塊 - 比如來電 - 將反覆在運行時產生的二進制數據(無符號char []或數組),然後將它傳遞給另一個模塊 - 比如被調用者。被調用模塊不會修改數組(它會進行復制並在必要時進行修改),因此一旦調用者模塊最初創建數組,它將不會更改大小(實際上不是內容)。但是,會出現兩個問題:1)每次生成數組時,調用者都可能不會生成相同大小的數組 - 它會在創建數組時在rutime時知道數組大小,但不會在編譯時生成數組大小。 2)調用者將數組傳遞給被調用者的方法需要能夠獲取調用者傳遞給它的任何大小的數組。
我考慮使其成爲一個模板函數,例如,
template<size_t N> void foo(const array<unsigned char, N>& my_array);
然而,我使用的接口類從被叫方模塊中實現分離的接口。因此,該功能必須是虛擬方法,與模板相互排斥。此外,即使這不是問題,它仍然會有與上面#1相同的問題 - 如果在編譯時未知數組大小,那麼它在編譯時也無法解析模板化函數。
我的實際功能可按:
virtual void foo(const array<unsigned char, N>& my_array); // but what is N???
因此,在總結,我是正確的,我唯一真正的選擇是使用矢量或本機陣列,例如,
virtual void foo(const vector<unsigned char> my_array); // unnecessary overhead
virtual void foo(const unsigned char[] my_array, size_t my_array_len); // yuk
或者是有一些訣竅我忽略這將讓我使用std :: array或boost :: array?
C++ 14有'std :: dynarray'和運行時大小的數組。 – chris
您是否確定了'std :: vector'需要多少開銷,並將其標識爲問題?我問,因爲它實際上是非常小的開銷(如果你正確使用它,每個容器有一個額外的指針):'std :: dynarray'的很大優勢實際上是基於堆棧的存儲的可能性。 – Yakk
是的,事實是std :: vector的開銷可能不會殺死我......這就是我現在正在墮落的東西。 –