2017-09-27 142 views
7

我一直認爲由sizeof返回的T類型的N個元素的數組的大小保證是N次sizeof(T)的N倍。是否保證sizeof(T [N])== N * sizeof(T)?

comments on this question讓我懷疑它。有信譽良好的用戶聲稱數組可能包含填充,這將打破平等。當然,這樣的平臺可能不存在,但它們允許嗎?

如果允許,這會打破很多常見的習慣用法,例如使用N * sizeof(T)計算數組所需的存儲空間,或者使用sizeof(a)/sizeof(a[0])來計算數組中元素的數量。

+0

鑑於'sizeof'總是處理靜態類型而不是運行時值,所以我不認爲實際內存的表現如何。是否sizeof(T [N])== N * sizeof(T)'是類型系統和預處理器的關注點。 –

+1

@AsadSaeeduddin - 正確的,我不認爲我暗示否則?或者也許這是對現在刪除的評論的回覆。 – BeeOnRope

+0

我在評論你所鏈接的話題的討論。很有可能存在這樣的情況:數組佔用的空間大於它們元素大小的總和,但這與'sizeof(T [N])'是'N * sizeof(T)'這一事實沒有關係。 '。 –

回答

2

整點sizeof是否包含相關的填充。數組中的每個元素在前一個元素後面都是sizeof(T)個字節。所以整個數組的大小是N * sizeof(T)

+1

我認爲問題是如果'sizeof(T)'允許爲陣列*添加額外的填充*。所有單獨的對象都有填充,但標準是否允許數組本身具有超出元素填充範圍的填充? –

+0

那個額外的填充從哪裏來? –

+0

從編譯器說'sizeof(T [N])> N * sizeof(T)',所以它在最後放置了額外的填充。 C++標準對佈局沒有太多的說明,只要額外的填充保持了'T [N]'的對齊要求,這至少需要'T'的那些(我認爲這是必需的是完全一樣的,但我不確定),這是允許的。 –

11

是的。 [expr.sizeof]包括該位約sizeof

當應用於陣列,其結果是在陣列中的字節的總數。這意味着元素大小的數組的大小是n倍。

+0

事情是,我不知道在哪裏定義了「數組中的字節總數」,我認爲「This implies ...」這個陳述是錯誤的;我認爲沒有這個聲明的標準的其餘部分並不意味着最終沒有看不見的填充。如果我對這個問題是正確的,那麼問題是這句話是否等同於「保證* n *元素的數組的大小是* n *乘以元素的大小」或者只是一個問題標準。 –

+0

@DanielH當然這是真的,在數組的末尾沒有填充。在標準的任何地方都沒有提到這種填充可能存在。 「一個數組類型的對象包含一組連續分配的非空的 類型的T個子對象。」而已。只有類型可能有填充字節。 –

+0

@ n.m。如果你經歷「當然」,那麼你會很快得到未定義的行爲。現在你指出這句話,我記得看到它,但人們並不確定它是否意味着它只包含那些事情。 –

相關問題