2012-06-05 66 views
3

答案應該很簡單,但我想確保。是sizeof()遞歸嗎?

sizeof()遞歸?例如,

struct foo 
{ 
    DWORD a; 
    DWORD b; 
}; 

struct bar 
{ 
    DWORD c; 
    foo d; 
}; 

將一個sizeof(bar)包括foo大小,返回一個完整的12個字節(假定DWORD是4個字節)?

+8

這本來是很容易嘗試了這一點爲自己,不是嗎? –

+1

確實;然而我想,因爲谷歌沒有給出任何額外的if和s或but's(即'某些編譯器做x'等),並且沒有向前回答,我認爲這是一個很好的q/a公開如果有人想要一個快速的答案可用。我知道我可以在幾秒鐘內測試這個;) – Qix

+1

@SimonAndréForsberg:不會。它只會告訴你,你的編譯器使它成爲12個字節。但是由於編譯器可能會插入填充,所以不能一概而論。 – MSalters

回答

5

是... sizeof給出了一個總直接包含在類型的所有成員,包括struct/class數據成員,非虛基類,一些實現定義的鏈接/計數器跟蹤虛擬鹼,虛擬調度表指針,填充有助於使數據成員與CPU安全或有效訪問保持一致,理論上實現可能感覺就像放在那裏一樣! (例如,用於運行時調試/錯誤檢測,垃圾收集的非標準支持......)

當然,它不包括指向或引用對象的大小,但包括這些指針和引用的大小。

+0

+1表示*「理論上其他任何實現可能感覺就像放在那裏!」* – Nawaz

6

是的,sizeof運算符爲您提供包含其所有成員的結構的大小。

但是請注意,編譯器可能會添加自己的填充,所以實際大小可能/不可能等於結構成員大小的總和。

3

是的。 TC3:從ISO/IEC 9899摘錄

當施加到具有結構或聯合類型的操作數,其結果是字節在這樣一個對象,包括內部和後填充的總數。

(重點煤礦)