C++空類及沒有成員變量的類的年夜小實例剖析。本站提示廣大學習愛好者:(C++空類及沒有成員變量的類的年夜小實例剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是C++空類及沒有成員變量的類的年夜小實例剖析正文
盡人皆知的C++中空類的年夜小為1,然則除空類以外的其他一些沒有成員變量的類的年夜小,照樣有相當一部門開辟人員對此有許多不明的地方的。
這裡我們以以下代碼為例:
#include 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)。