在C ++ 11 std::array中,連續存儲和性能的定義不比數組差,但是我無法確定標準的各種要求是否暗示std :: array具有與普通數組相同的大小和內存布局數組。那是您可以依靠的sizeof(std::array<int,N>) == sizeof(int)*N還是該實現特定的?特別是,這是否可以保證按照您期望的方式工作:std::vector< std::array<int, N> > x(M);typedef (*ArrayPointer)[N];ArrayPointer y = (ArrayPointer) &x[0][0];// use y like normal multidimensional array它可以在我嘗試過的兩個編譯器(GNU和Intel)中工作。此外,我可以找到的所有第三方文檔(像這樣)都指出std :: array與普通數組一樣具有高效的內存,再加上連續的要求,則意味著它必須具有相同的內存布局。但是我在標準中找不到此要求。
2 回答

泛舟湖上清波郎朗
TA貢獻1818條經驗 獲得超3個贊
它幾乎需要。具體而言,第23.3.2.1/2節說:
數組是一個聚合(8.5.1),可以使用以下語法初始化
array<T, N> a = { initializer-list };
其中initializer-list是逗號分隔的列表,其中包含最多N個元素,其類型可轉換為T。
由于它是一個聚合,因此不能使用任何類型的構造函數將初始化列表中的數據轉換為正確的格式。這實際上僅留下一種可能性:它唯一可以存儲的是值本身。
我想一個可能會std::array在指定的數據之后存儲某種輔助數據,例如將額外的內存設置為某個預定義的值,因此,如果您在數組末尾進行寫操作,則可能會更改該數據。然后,編譯器/運行時將在關閉時檢查這些值,如果您更改了這些值,請報告代碼的未定義行為。
它也可能是一個編譯器可以用于做填充/對齊不同std::array比內置陣列。一個甚至可能需要這樣做的明顯例子是支持超對齊要求,例如與Intel SSE指令一起使用的數據。內置數組不支持超對齊,但是我認為的規范std::array可能不夠寬松。
底線:在不考慮可能存在多少可能性的問題的情況下,很明顯std::array不必一定要遵循您所要求的規則。

人到中年有點甜
TA貢獻1895條經驗 獲得超7個贊
實時示例(是的,這沒有什么證明。我仔細搜索了Standard,沒有發現任何聚合或文字類型的布局要求,僅是標準布局類型;以前的POD在C ++ 03中具有這些要求。
- 2 回答
- 0 關注
- 6911 瀏覽
添加回答
舉報
0/150
提交
取消