亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

標準定義的std :: array的大小是

標準定義的std :: array的大小是

C++
倚天杖 2019-12-31 01:00:50
在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貢獻1796條經驗 獲得超7個贊

它幾乎需要。具體而言,第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不必一定要遵循您所要求的規則。



查看完整回答
反對 回復 2020-01-06
?
莫回無

TA貢獻1865條經驗 獲得超7個贊

實時示例(是的,這沒有什么證明。我仔細搜索了Standard,沒有發現任何聚合或文字類型的布局要求,僅是標準布局類型;以前的POD在C ++ 03中具有這些要求。

 

查看完整回答
反對 回復 2020-01-06
  • 2 回答
  • 0 關注
  • 694 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號