天天看點

sizeof計算類的大小

轉載位址為:http://blog.csdn.net/u013074465/article/details/42780825

一個空的類的大小為1個位元組;

1.類的大小為類的非靜态成員資料的類型大小之和,也就是說靜态成員資料不作考慮。

c++将類的非靜态資料成員存放在類的每個對象中,對于繼承而來的非靜态資料成員(不管基類是否為虛)都是如此;

靜态資料成員不是類的組成部分,它存放在程式的全局資料區中,獨立于任何類的對象而存在,不會影響類對象的大小;類無論産生多少對象,static資料成員都僅存在一份執行個體;靜态資料成員不在類的對象中,是以存取static資料成員不需要通過類對象;

如果去靜态資料成員的位址,會得到一個指向其資料類型的指針,而不是一個指向其類成員的指針,因為靜态資料成員并不包含在任何一個類對象中;

而非靜态資料成員直接存放在每個類對象中,除非經由顯示或隐式類對象,否則無法直接存取他們,隻要程式員在一個成員函數中直接處理一個非靜态資料成員,即隐式類對象就會發生。

要對一個非靜态資料成員存取,編譯器需要把類對象的起始位址加上該資料成員的偏移位置;

2、普通成員函數與sizeof無關

類的普通成員、靜态成員函數是不占類記憶體的,至于函數指針在類中有虛函數的時候存在一個虛函數表的指針,即,類裡如果有虛函數則它的sizeof會增加4個位元組。其實類的成員函數實際上與普通的全局函數一樣,隻不過編譯器在編譯的時候錄,會在成員函數上加一個參數,傳入這個對象的指針。成員函數位址是全局已知的,對象的記憶體空間裡無法儲存成員函數的位址。對您成員函數的調用在編譯時就确定了。函數是不算到sizeof中的,因為函數是代碼,被各個對象公用,跟資料處理方式不同。對象中不必有函數指針,因為對象沒必要知道它的各個函數的位址。類的屬性是指類的資料成員,他們是執行個體化一個對象時就為資料成員配置設定記憶體了,而且每個對象的資料成員是對立的,而成員函數是共有的。靜态成員函數與一般成員函數的唯一差別就是沒有this指針,是以不能通路非靜态資料成員。總之,程式中的所有函數都是位于代碼區的。

3、虛函數由于要維護在虛函數表,是以要占據一個指針大小,也就是4位元組;

4、類的總大小也遵守類似class位元組對其的,調整規則;

5、如果子類中也含有虛函數,那麼它不會有自己的虛表,而是和基類公用,是以派生類的大小不包含派生類虛表所占用的空間。

繼續閱讀