重新回顧C++基礎知識,發(fā)現(xiàn)很多有趣的事情。
1、普通數(shù)據(jù)類型的sizeof
普通數(shù)據(jù)類型,比如說char、short、int、long、ptr等等,和系統(tǒng)位數(shù)(32位或者64位)有關。
2、數(shù)組的sizeof
3、結構體的sizeof
4、類的sizeof
4.1 空類
僅有類的聲明,沒有任何成員函數(shù),也沒有任何成員數(shù)據(jù)。這種類的sizeof固定為1。

以上代碼運行后輸出結果為:A=1, a=1
空類也是類,也可以進行實例化,在編譯空類的時候編譯器會隱含添加1個字節(jié),以便實例化的時候不同的對象擁有不同的地址(To ensure that the addresses of two different objects will be different.),所以空類的sizeof為1。

返回的結果為:A=1, a=1
類的大小與它的構造函數(shù)、析構函數(shù)(虛析構函數(shù)除外)和其他普通函數(shù)成員(虛函數(shù)除外)無關,只已它的數(shù)據(jù)成員有關。
4.2 普通類
普通的類中,包含普通的函數(shù)或者數(shù)據(jù)成員。
4.2.1 普通函數(shù)成員和普通數(shù)據(jù)成員

返回的結果為:A=8, a=8, size=8
4.2.2 多個不同數(shù)據(jù)類型的數(shù)據(jù)成員,如下定義:

返回的結果為:A=16, a=16, size=16

返回的結果為:A=32, a=32, size=22
我們將數(shù)據(jù)成員變量p和z的聲明的位置互換,看下面這個例子:

返回的結果為:A=24, a=24, size=22
為什么sizeof的結果不一樣呢?原因是這里面存在字節(jié)對齊問題。
4.2.3 有靜態(tài)數(shù)據(jù)成員

返回結果為:A=8, a=8, size=8
靜態(tài)數(shù)據(jù)成員被編譯器放在程序的一個global data members中,它是類的一個數(shù)據(jù)成員。但是它不影響類的大小,不管這個類實際產(chǎn)生了多少實例,還是派生了多少新的類,靜態(tài)數(shù)據(jù)成員在類中永遠只有一個實體存在。而類的非靜態(tài)數(shù)據(jù)成員只有被實例化的時候,他們才會被創(chuàng)建。但是類的靜態(tài)數(shù)據(jù)成員一旦被聲明,無論類是否被實例化,它都已被創(chuàng)建??梢赃@么說,類的靜態(tài)數(shù)據(jù)成員是一種特殊的全局變量。
4.2.4 有虛函數(shù)

返回的結果為:A=8, a=8
當類中有虛函數(shù)(包括虛析構函數(shù))的時候,會有一個指向虛函數(shù)表的指針(vptr),在32位系統(tǒng)分配指針大小為4字節(jié),64位系統(tǒng)分配指針大小為8字節(jié)。
4.3 有繼承
4.3.1 簡單繼承關系
4.3.2 有虛函數(shù)繼承關系
4.3.3 虛繼承關系
當存在虛擬繼承時,派生類中會有一個指向虛基類表的指針。所以其大小應為普通繼承的大小,再加上虛基類表的指針大小。