C++中的对象_纪要(二)
C++對象的內(nèi)存布局
看以下程序,C++如何存儲和實(shí)現(xiàn)這個類的對象:
View Code 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 class simpleClass{ 5 public: 6 static int nCount; //靜態(tài)成員數(shù)據(jù) 7 int nValue; //非靜態(tài)成員數(shù)據(jù) 8 char c; 9 10 simpleClass(){} 11 virtual ~simpleClass(){} //虛析構(gòu)函數(shù) 12 int getValue(); //非靜態(tài)成員函數(shù) 13 virtual void foo(void){} //虛函數(shù) 14 static void addCount(); //靜態(tài)成員函數(shù) 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 }執(zhí)行結(jié)果:
結(jié)果顯示通過sizeof()得到的simpleClass的對象是12個字節(jié)。
靜態(tài)數(shù)據(jù)成員存儲在全局/靜態(tài)存儲區(qū)中,并不作為對象占據(jù)內(nèi)存的一部分,sizeof()返回的大小不包括nCount所占據(jù)的內(nèi)存的大小。
nValue是整型,大小為4個字節(jié)(32位機(jī)),c是字符型,大小是1個字節(jié)。32位機(jī)上,為了提高效率會按4個自己對齊,因此c也占據(jù)了4個字節(jié)。
這樣,simpleClass中的數(shù)據(jù)成員共占用了8個字節(jié)。而simpleClass中還有1個靜態(tài)成員函數(shù),兩個虛函數(shù)和兩個非靜態(tài)成員函數(shù),這些函數(shù)不會只占用4個字節(jié)。
如果修改simpleClass,去掉兩個虛函數(shù),此時通過sizeof()得到的simpleClass對象的大小就變成了8個字節(jié),可見剩下的4個字節(jié)和虛函數(shù)有關(guān)。
虛函數(shù)是C++中的一個重要特性,用來實(shí)現(xiàn)面向?qū)ο笾械亩鄳B(tài)性。即只有在程序運(yùn)行時,才能決定一個父類對象的指針調(diào)用的函數(shù)是父類還是子類中的實(shí)現(xiàn)。為了實(shí)現(xiàn)這一特性,C++編譯器在碰到含有虛函數(shù)的類時,會分配一個指針指向一個函數(shù)地址表,叫做“虛函數(shù)表”,這4個字節(jié)就是虛函數(shù)表指針?biāo)紦?jù)的4個字節(jié)。
從以上執(zhí)行結(jié)果中可以看出,虛函數(shù)表指針占據(jù)的是一個對象開始的4個字節(jié)。
對于靜態(tài)成員函數(shù)和非靜態(tài)成員函數(shù),C++編譯器采用與普通C函數(shù)類似的方式進(jìn)行編譯,只不過對函數(shù)名進(jìn)行了名稱修飾,用來支持重載。并且在參數(shù)列表中增加了一個this指針,用來表明是哪一個對象調(diào)用的該函數(shù)。因此靜態(tài)成員函數(shù)和非靜態(tài)成員函數(shù)的多少對對象的大小沒有影響。
結(jié)論:
1)非靜態(tài)數(shù)據(jù)成員是影響對象占據(jù)內(nèi)存大小的主要因素,隨著對象數(shù)目的增加,非靜態(tài)成員占據(jù)的內(nèi)存會相應(yīng)的增加。
2)所有的對象共享一份靜態(tài)數(shù)據(jù)成員,所以靜態(tài)數(shù)據(jù)成員占據(jù)的內(nèi)存的數(shù)量不會隨著對象數(shù)據(jù)數(shù)目的增加而增加。
3)靜態(tài)成員函數(shù)和非靜態(tài)成員函數(shù)不會影響對象內(nèi)存的大小,雖然其實(shí)現(xiàn)會占用相應(yīng)的內(nèi)存空間,同樣也不會隨著對象數(shù)據(jù)的增加而增加。
4)如果對象中包含虛函數(shù),會增加4個字節(jié)的空間,不論有多少個虛函數(shù)。
轉(zhuǎn)載于:https://www.cnblogs.com/kkkwar/archive/2012/04/22/2465232.html
總結(jié)
以上是生活随笔為你收集整理的C++中的对象_纪要(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 让我奔溃的css
- 下一篇: QT中文显示乱码解决