深度探索C 物件模型之Data語意學讀書筆記

2021-06-20 02:22:47 字數 781 閱讀 8172

3.4繼承與data member

測試原始碼

class concrete1;

class concrete2:public concrete1;

class concrete3:public concrete2;

對於此例子,使用vc++編譯,程式執行結果與書中討論相符,sizeof(concrete3)為16。使用gcc編譯,結果不符,sizeof(concrete3)為8。

可見,gcc在這裡進行了特殊的優化。真正涉及到類似問題,不能輕易下結論,不同編譯器可能有所不同。

測試原始碼

#include #include #include using namespace std;

class b{

public:

virtual void test0(){

cout<<"b test0"<

1.gcc和vc++均把vptr放置在物件的頭部

2.vptr指向的virtual table裡有乙個slot,用以支援runtime type identification,但gcc和vc++並沒有把slot放置在下標為0的位置。

vc++使用虛繼承物件尺寸增加乙個指標大小,使用virtual base class table技術,引入一種新型指標。

gcc引入虛繼承物件尺寸並沒有增大,猜測有可能使用virtual function table中放置virtual base class的offset技術,復用vptr,賦予vptr和vtbl雙重任務。

深度探索c 物件模型(3) data

空基類的大小為1byte,為了讓不同的空型別的位址有區別 一 data member的布局 nonstatic member data按宣告順序存在class object中 static member data位於global data segment 不會影響object大小 對static m...

深度探索C 物件模型 Data語意學筆記

class x class y public virtual x class z public virtual x class a public y,public z 它們的sizeof結果如下 sizeof x 1 sizeof y 8 視編譯器不同而不同 sizeof z 8 視編譯器不同而不同...

深度探索C 物件模型 Data語義學

1 data member的繫結 對於下圖的類 x 中的x返回的是類內部的x,這是因為編譯器對於這個的處理是,如果乙個inline函式在類宣告之後立刻被定義,但還是在整個類宣告完成之後,才隊這個成員函式的本體進行分析,所以x繫結的是類內部的x 然而對於成員函式的引數列表則不是這樣的,它們會在第一次遇...