2013-10-03 83 views
4

出於好奇,我看了一下std :: array的LLVM實現,並注意到它是一個結構體。我看過的大多數其他STL容器(矢量,隊列,地圖)都是類。它作爲一個結構出現在標準中,所以是故意的。爲什麼C++ 11 std :: array結構而不是類?

任何人都知道這可能是爲什麼?

+2

它似乎是一個常用的POD類型結構的慣例,但我不知道這是否是原因。 –

+2

聚合可能沒有私人或受保護的成員,並且'std :: array'必須是聚合。 – dyp

回答

10

從技術上講,它既不是結構也不是類 - 它是一個模板。

std::array必須是aggregate。長話短說,這最終意味着它不能擁有任何私人的東西 - 所以它可能被寫爲struct(默認爲公開),而不是class(默認爲使所有內容私人的)。

如果你想你可以寫爲class反正:

template <...> 
class array { 
public: 
// ... 

但你需要讓一切公開,所以你還不如用一個struct在默認情況下做到這一點。

+0

感謝您的回答!你知道爲什麼決定使std :: array成爲一個聚合嗎? – elSnape

+1

@elSnape'std :: array'比C++ 11(boost,C++ 03TR1)舊,並且需要C++ 03中的聚合初始化語法,用於像'std :: array my_arr = {1, 2,3,4,5};' – dyp

+4

@elSnape因爲std :: array需要儘可能的小。一個設計決定是所有std :: array的代碼都應該在編譯時消失,以使其與裸數組一樣高效(空間和時間)。 –

1

std::array是POD類型,以便它可以像這樣進行初始化:

std::array<int, 5> arr = { 1, 2, 3, 4, 5 }; 

這是從在一個initializer_list初始化不同陣列實際上並不對陣列元件和移動分配新的空間來自初始化器列表的數據在那裏,但括號中的數據(最終在初始化的數據段中)數組的內部表示。

這意味着沒有複製或移動,實際上沒有代碼正在運行來初始化任何東西。只要將可執行文件加載到內存中,陣列就準備就緒。

+0

可變模板構造函數可以具有相同的語法,並且移動elision(+優化)應該導致相同的速度。 – dyp

+0

@DyP不,因爲那仍然需要代碼才能運行。對於'std :: array' *,沒有代碼在運行時進行任何初始化*。零。還記得我評論過的其他帖子嗎? 「沒有代碼」的速度就像你得到的那樣快。 – Fozi

+0

@DyP此外,這還解決了一些其他問題,如初始化的未定義順序和全局靜態對象的破壞。這根本不適用於簡單類型的'std :: array's。他們來到pre-initalized並存在,直到OS釋放進程的內存,就像C風格的陣列。 – Fozi

相關問題