sizeof 是運算符,而不是函數。雖然咱們習慣sizeof(...),但( )並非必需的,它只是表示優先級。咱們把sizeof後面的目標叫對象或者操做數。本文約定就叫sizeof對象。c++
當sizeof 的對象是表達式時,求的大小是表達式返回值的類型大小,但並不計算表達式的值數組
一樣若是對象是函數,則返回函數返回值類型大小,也不執行函數體函數
注意sizeof 對象是指針和數組的區別。spa
當sizeof的對象是數組時,返回數組總大小,而當對象是指針時,返回指針自己的大小,而不是指示內存空間的大小;指針
但注意:當數組名做爲實參傳入函數時,會自動轉化爲指針類型;但並不影響形參的類型;
對象
sizeof 沒法獲取動態分配的內存大小,即便用malloc動態的分配內存,沒法使用sizeof獲取其大小。內存
關於結構體類型編譯器
理論上一個結構體所佔空間是全部成員的大小總和,但因爲考慮到對齊問題,會有填充字節。編譯
1、結構體默認按天然對界對齊;數據
2、#pragma pack(n)規定的對齊長度,實際使用的規則是:
1)結構,聯合,或者類的數據成員,第一個放在偏移爲0的地方,之後每一個數據成員的對齊,起始位置必須是對齊模數的整數倍。對齊模數是#pragma pack指定的數值和數據成員的長度中比較小的那個。就是說,當#pragma pack的值等於或超過全部數據成員長度的時候,這個值的大小將不產生任何效果。
2) 結構體的對齊,按照結構體中size最大的數據成員和#pragma pack指定值之間,較小的那個進行。
eg:pack(4) struct a{int c1; char c2; char c3;}; 大小爲8字節 pack(4) struct b{int c1; char c2; int c3;};大小爲12字節
關於類
空類的大小爲1字節;空類型實例中不包含任何信息,應該大小爲0. 可是當咱們聲明該類型的實例的時候,它必須在內存中佔有必定的空間,不然沒法使用這些實例。至於佔用多少內存,由編譯器決定。g++中每一個空類型的實例佔1字節空間。注意空struct即空類,這就是爲何c++的空struct佔一個字節的緣由。
含有虛函數的類要加一個虛表指針的大小,32位系統下爲4字節,64位下爲8字節;