C++中的对象_纪要(二)
C++對象的內存布局
看以下程序,C++如何存儲和實現這個類的對象:
View Code 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 class simpleClass{ 5 public: 6 static int nCount; //靜態成員數據 7 int nValue; //非靜態成員數據 8 char c; 9 10 simpleClass(){} 11 virtual ~simpleClass(){} //虛析構函數 12 int getValue(); //非靜態成員函數 13 virtual void foo(void){} //虛函數 14 static void addCount(); //靜態成員函數 15 }; 16 int main() 17 { 18 simpleClass aSimple; 19 printf("Object start address: %x\n", &aSimple); 20 printf("nValue address: %x\n",&aSimple.nValue); 21 printf("c address: %x\n",&aSimple.c); 22 printf("size: %d\n", sizeof(simpleClass)); 23 24 return 0; 25 }執行結果:
結果顯示通過sizeof()得到的simpleClass的對象是12個字節。
靜態數據成員存儲在全局/靜態存儲區中,并不作為對象占據內存的一部分,sizeof()返回的大小不包括nCount所占據的內存的大小。
nValue是整型,大小為4個字節(32位機),c是字符型,大小是1個字節。32位機上,為了提高效率會按4個自己對齊,因此c也占據了4個字節。
這樣,simpleClass中的數據成員共占用了8個字節。而simpleClass中還有1個靜態成員函數,兩個虛函數和兩個非靜態成員函數,這些函數不會只占用4個字節。
如果修改simpleClass,去掉兩個虛函數,此時通過sizeof()得到的simpleClass對象的大小就變成了8個字節,可見剩下的4個字節和虛函數有關。
虛函數是C++中的一個重要特性,用來實現面向對象中的多態性。即只有在程序運行時,才能決定一個父類對象的指針調用的函數是父類還是子類中的實現。為了實現這一特性,C++編譯器在碰到含有虛函數的類時,會分配一個指針指向一個函數地址表,叫做“虛函數表”,這4個字節就是虛函數表指針所占據的4個字節。
從以上執行結果中可以看出,虛函數表指針占據的是一個對象開始的4個字節。
對于靜態成員函數和非靜態成員函數,C++編譯器采用與普通C函數類似的方式進行編譯,只不過對函數名進行了名稱修飾,用來支持重載。并且在參數列表中增加了一個this指針,用來表明是哪一個對象調用的該函數。因此靜態成員函數和非靜態成員函數的多少對對象的大小沒有影響。
結論:
1)非靜態數據成員是影響對象占據內存大小的主要因素,隨著對象數目的增加,非靜態成員占據的內存會相應的增加。
2)所有的對象共享一份靜態數據成員,所以靜態數據成員占據的內存的數量不會隨著對象數據數目的增加而增加。
3)靜態成員函數和非靜態成員函數不會影響對象內存的大小,雖然其實現會占用相應的內存空間,同樣也不會隨著對象數據的增加而增加。
4)如果對象中包含虛函數,會增加4個字節的空間,不論有多少個虛函數。
轉載于:https://www.cnblogs.com/kkkwar/archive/2012/04/22/2465232.html
總結
以上是生活随笔為你收集整理的C++中的对象_纪要(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 让我奔溃的css
- 下一篇: Letters比赛第六场1004 Uni