1.空類所占字節數為1,可見代碼如下
#include <iostream> using namespace std; class Parent { }; class Child:public Parent { public: int b ; }; int main(int argc, char* argv[]) { Child b; Parent a; cout << "a.sizeof = " << sizeof(a) << endl; cout << "b.sizeof = " << sizeof(b) << endl; system("pause"); return 0; }
打印結果為:

分析:
為了能夠區分不同的對象,一個空類在內存中只占一個字節;
在子類繼承父類后,如果子類仍然是空類,則子類也在內存中指針一個字節;
如果子類不是空類,則按照成員變量所占字節大小計算。
2.類中的成員函數不占內存空間,虛函數除外;
#include <iostream> using namespace std; class Parent { public: void func() {}; void func1() { int a; }; void func2() { int b; }; }; class Child:public Parent { public: int b ; }; int main(int argc, char* argv[]) { Child b; Parent a; cout << "a.sizeof = " << sizeof(a) << endl; cout << "b.sizeof = " << sizeof(b) << endl; system("pause"); return 0; }
輸出結果如下:

分析:上述代碼中父類,在內存中仍然只占有一個字節;原因就是因為函數在內存中不占字節;
但是,如果父類中如果有一個虛函數,則類所字節發生變化,如果是32位編譯器,則占內存四個字節;
#include <iostream> using namespace std; class Parent { public: virtual void func() {}; virtual void func1() { int a; }; void func2() { int b; }; }; class Child:public Parent { public: int b ; }; int main(int argc, char* argv[]) { Child b; Parent a; cout << "a.sizeof = " << sizeof(a) << endl; cout << "b.sizeof = " << sizeof(b) << endl; system("pause"); return 0; }
輸出結果:

分析:
通過上述代碼可見,編譯器為32時,無論幾個虛函數所占的字節數都為4;
而子類在內存中占的字節數為父類所占字節數+自身成員所占的字節數;
3.和結構體一樣,類中自身帶有四字節對齊功能
#include <iostream> using namespace std; class Parent { public: char a; virtual void func() {}; virtual void func1() { int a; }; void func2() { int b; }; }; class Child:public Parent { public: char c; int b ; }; int main(int argc, char* argv[]) { Child b; Parent a; cout << "a.sizeof = " << sizeof(a) << endl; cout << "b.sizeof = " << sizeof(b) << endl; system("pause"); return 0; }
輸出結果:

分析:
Parent類中,char a;占一個字節,虛函數占有四個字節,由於類的字節對齊,所以總共父類占有8個字節;
子類中,char c 占有一個字節,int 占四個字節,由於字節對齊,本身共占有8字節,再加上父類的8字節,共占有16字節;
4.類中的static靜態成員變量不占內存,靜態成員變量存儲在靜態區
#include <iostream> using namespace std; class G { public: static int a; }; int main(int argc, char * argv[]) { cout << sizeof(G)<<endl; system("pause"); return 0; }
結果輸出:

總結:
1.空類必須占一個字節;
2.非虛函數指針不占字節;
3.虛函數根據編譯器位數,占相應字節,不論虛函數個數,只占一個虛函數的字節;
4.類具有4字節對齊功能;
5.類中的靜態成員變量不占類的內存;並且靜態成員變量的初始化必須在類外初始化;
