程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++空類以及沒有成員變量的類的大小

C++空類以及沒有成員變量的類的大小

編輯:C++入門知識

  關於C++中空類的大小為1,我們大家都有所了解,但是除了空類之外的其他一些沒有成員變量的類的大小,還是有很多不明之處的。

  我們來看如下一個例子:

#include<iostream>

using namespace std;

class a {};

class b{};

class c :public a{

    virtual void fun() = 0;

 

};

class d :public b, public c{};

int main()

{

    cout << "sizeof(a)" << sizeof(a) << endl;

    cout << "sizeof(b)" << sizeof(b) << endl;

    cout << "sizeof(c)" << sizeof(c) << endl;

    cout << "sizeof(d)" << sizeof(d) << endl;

    getchar();

    return 0;

}

程序執行的輸出結果為:

sizeof(a)=1

sizeof(b)=1

sizeof(c)=4

sizeof(d)=8

  為什麼會出現這種結果呢?初學者肯定會很煩惱是嗎?類a,b明明是空類,它的大小應該為為0,為什麼 編譯器輸出的結果為1呢?這就是我們剛才所說的實例化的原因(空類同樣可以被實例化),每個實例在內存中都有一個獨一無二的地址,為了達到這個目的,編譯器往往會給一個空類隱含的加一個字節,這樣空類在實例化後在內存得到了獨一無二的地址,所以a,b的大小為1。

  而類c是由類a派生而來,它裡面有一個純虛函數,由於有虛函數的原因,有一個指向虛函數表的指針(vptr,有多個虛函數仍然是只有一個指針),在32位的系統分配給指針的大小為4個字節,所以最後得到c類的大小為4。

  類d的大小更讓初學者疑惑吧,類d是由類b,c派生而來的,它的大小應該為二者之和5,為什麼卻是8呢?這是因為為了提高實例在內存中的存取效率,內存中會有數據對齊,於是類的大小往往被調整到4字節的整數倍。並采取就近的法則,往大的方向取最近的倍數,就是該類的大小,所以類d的大小為8個字節(假如d由3個空類和c派生而來,仍然是8)。

  當然在不同的編譯器上得到的結果可能不同,但是這個實驗告訴我們,不管類是否為空類,是否有成員變量,這個類在創建對象的時候都是需要分配空間的(sizeof的作用見我另外一篇博文:http://www.cnblogs.com/yanqi0124/p/3796736.html)。

參考地址:http://blog.csdn.net/hitblue/article/details/3726754

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved