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

C++空類及沒有成員變量的類的年夜小實例剖析

編輯:關於C++

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)。

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