C C 空類的大小及相關繼承類的大小

2021-06-28 14:45:30 字數 1620 閱讀 4771

乙個c++空類例項化大小事實上並不空,它有乙個隱晦的1個byte.

首先:何為類的例項化?

所謂類的例項化,就是在記憶體中分配一塊位址。

例一:

#includeusing namespace std;

class a {};

class b {};

class c : public a ;

class d : public b, public c {};

int main()

;class b;

int b::data1=0;

void main()

void f(int x)

;class y : public virtual x {};

class z : public virtual x {};

class a : public y, public z {};

// 上述為經典的鑽石繼承

int main()

輸出結果:
sizeof(x): 1

sizeof(y): 4

sizeof(z): 4

sizeof(a): 8

請按任意鍵繼續. . .

如`例一`一樣,類x是乙個空的類,但它事實上並不是空的,它有乙個隱晦的1 type,那是被編譯器安插進去的乙個char,它主要使這個類的物件可以在記憶體中配置乙個獨一無二的位址。

如:

x a, b;

if (&a == &b)

類y,類z的大小受三個因素的影響:

1)語言本身所造成的額外負擔:因為類y與類z都是公有虛繼承於類x,這裡將有vptr,在32位上為4個位元組。

2)編譯器對特殊情況所做的優化處理:這裡做了優化,乙個空的虛基類被放在了派生類的最開頭的部分,也就是說它未花費任何額外的空間,這就節省了類x的1位元組,

如未做優化:乙個空的虛基類被放在了派生類的固定不變動的尾端。

3)alignment 對長補齊的限制:對長補齊,上述未做優化,則虛基類x的1個位元組與類y的4個位元組(共5個位元組),補齊3個位元組,最終為8個位元組。

做優化,則虛基類x的1個位元組將被省略,只有類y的4個位元組(共4個位元組),不需要補齊,最終為4個位元組。

注:補齊就是將數值調整為某個整數的整數倍,在32位機器上,一般alignment 為 4 個位元組。

記住:乙個虛基類物件只會在派生類中存在乙份實體,不管它在繼承體系中出現了多少次!

類a的大小:

1)類x,所有繼承類唯一共享的實體,大小為1 type.

2)類y:做了優化,只有4 type

3)類z:同上,只有4 type

4)類a:1 + 4 + 4 = 9 type,補齊為12 type,做了優化,4+4=8

從以上的幾個例子總結類的大小:

1).為類的非靜態成員資料的型別大小之和.

2).有編譯器額外加入的成員變數的大小,用來支援語言的某些特性(如:指向虛函式的指標).

3).為了優化訪問效率,進行的邊緣調整.

4).與類中的建構函式,析構函式以及其他的成員函式無關.

空類,虛函式類,虛繼承類的空間大小

include using namespace std class a a是空類,編譯器會用乙個char型別標記這個類,大小為1 class b public a b繼承了a,但同樣也是空類,大小為1 class c virtual public a 虛擬繼承的時候編譯器會安插乙個指向父類的指標,大...

char 大小 空類的大小

通過菱形繼承關係討論在繼承體系中不同繼承的情況,base類和derive類的尺寸。class類之間的關係,用圖表示如下 在普通public繼承的體系下,上述繼承關係如下 在這種繼承體系下,所有的derived類都以public的形式繼承自base類。通過程式得到不同平台下的大小 繼承體系下所有的em...

c 空類的大小

初學者在學習物件導向的程式語言時,或多或少的都些疑問,我們寫的 與最終生編譯成的 卻 大相徑庭,我們並不知道編譯器在後台做了什麼工作 這些都是由於我們僅停留在語言層的原因,所謂語言層就是教會我們一些基本的語法法則,但不會告訴我們為什麼這麼做?今天和大家談的一點感悟就是我在學習程式設計過程中的一點經驗...