c++類占內存空間大小計算


x64環境下實現:

  1 #include <iostream>
  2 
  3 using namespace std;
  4 
  5 class kong{
  6 
  7 };
  8 
  9 class kong1{
 10 
 11 };
 12 
 13 class kong2{
 14 
 15 };
 16 
 17 class data2
 18 {
 19     int a;    //4個字節
 20     char s;
 21 };
 22 
 23 class data3
 24 {
 25     int a;
 26     char s;
 27     virtual void kong();      //在64位系統分配指針大小為8字節
 28     virtual void kong1();
 29 };
 30 
 31 class data4 : public data3
 32 {
 33     
 34 };
 35 
 36 class data5 : virtual public data3
 37 {
 38 
 39 };
 40 
 41 class data6 : public data3
 42 {
 43     virtual void kong();
 44 };
 45 
 46 class data7 : virtual public data3
 47 {
 48     virtual void kong();
 49 };
 50 
 51 class data8 : public data2
 52 {
 53     virtual void kong();
 54 };
 55 
 56 class data9 : public data2
 57 {
 58     
 59 };
 60 
 61 class data10 : virtual public data2
 62 {
 63     virtual void kong();
 64 };
 65 
 66 class data11 : virtual public data2
 67 {
 68     
 69 };
 70 
 71 int main()
 72 {
 73     //c++要求每個實例在內存中都有獨一無二的地址。空類也會被實例化,所以編譯器會給空類隱含的添加一個字節,這樣空類實例化之后就有了獨一無二的地址了。所以空類的sizeof為1
 74     kong ko;
 75     cout << sizeof(ko) << " " << sizeof(kong) << endl;
 76 
 77     //包含了對齊,64位int型4個字節
 78     data2 da;
 79     cout << sizeof(da) << " " << sizeof(data2) << endl;
 80 
 81     //C++ 類中有虛函數的時候有一個指向虛函數的指針(vptr),在32位系統分配指針大小為4字節,在64位系統分配指針大小為8字節。無論多少個虛函數,只有這一個指針,8字節
 82     cout << sizeof(data3) << endl;
 83 
 84     //data3類(包含virtual),data4(不包含virtual)直接繼承data3 輸出為16, C++ 類中有虛函數的時候有一個指向虛函數的指針(vptr),在64位系統分配指針大小為8字節。無論多少個虛
 85     //函數,只有這一個指針,8字節。並且子類的大小是本身成員變量的大小加上父類的大小。 父類16 子類0
 86     cout << sizeof(data4) << endl;
 87 
 88     //若data5(不包含virtual)虛繼承data3, 輸出為24, 父類16加上子類的virtual(8),指針8
 89     cout << sizeof(data5) << endl;
 90 
 91     //data3類(包含virtual),data6(包含virtual)直接繼承data3 輸出為16, 原因:如果子類直接繼承父類,他們是共享一個虛函數指針
 92     cout << sizeof(data6) << endl;
 93 
 94     //若是data7(包含virtual)虛繼承data3,輸出為24, 父類16,子類虛函數指針8 輸出24
 95     cout << sizeof(data7) << endl;
 96 
 97     //data2類(不包含virtual),data8(包含virtual)直接繼承 輸出為16, 父類為8 子類虛函數指針8 輸出為16
 98     cout << sizeof(data8) << endl;
 99 
100     //若data9(不包含virtual)直接繼承data2類(不包含virtual),輸出為8, 父類8 子類0 輸出8
101     cout << sizeof(data9) << endl;
102 
103     //data10(包含virtual)虛繼承data2類(不包含virtual), 輸出為 24, 父類為8 ,虛基類指針為8,子類虛函數指針8 輸出為24
104     cout << sizeof(data10) << endl;
105 
106     //data11(不包含virtual)虛繼承data2類(不包含virtual), 輸出為 16, 父類為8 ,虛基類指針為8, 輸出為16
107     cout << sizeof(data11) << endl;
108 
109 
110     //如果有多個virtual函數,只有一個指針
111     //若子類虛繼承,則子類有自己的一個虛函數指針
112     //子類直接繼承父類,若父中由virtual,則父子共享一個指針用來指定虛函數的虛擬函數表的入口地址
113 
114     return 0;
115 }

 

結果(單位:字節):

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM