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