C 物件模型

2021-07-29 05:44:16 字數 2184 閱讀 4115

參考自

原文中物件記憶體布局有誤(圖中虛表指標應在對應成員變數之前),但虛表的內容可以參考

單一繼承

visual_ptr.cpp

[cpp]view plain

copy

print?

class

a    

virtual

intfuna() {}  

private

:  int

val ;  

char

bit1 ;  

} ;  

class

b : 

public

a    

virtual

intfunb() {}  

private

:  char

bit2 ;  

};  

int main()

clang -xclang -fdump-record-layouts visual_ptr.cpp

結果:a:

可以看到:

先放虛表指標,然後存各個成員變數,且遵循對齊原則。

多重繼承

visual_ptr2.cpp

class

a    

virtual

~a() {}  

virtual

intfoo()   

virtual

intfuna() {}  

private

:  int

val ;  

char

bit1 ;  

} ;  

classb  

virtual

~b() {}  

virtual

intfoo()   

virtual

intfunb(){}  

private

:  char

bit2 ;  

};  

class

derived : 

public

a, public

b    

virtual

~derived() {}  

virtual

intfoo()   

virtual

intfunderived() {}  

private

:  char

bit3 ;  

}; int main()

clang -xclang -fdump-record-layouts visual_ptr2.cpp

結果: a:

虛繼承class

可以看出虛繼承不像一般繼承那樣

1.一般繼承

把放在頂部,把新增派生類成員放在尾部,而

虛繼承是把新增派生類成員放在頂部,把基類成員放在尾部。

2.虛繼承會為派生類生成

乙個虛表指標。派生類class b部分的指標指向的

虛函式表的前面增加了一項:offset

(從物件的開頭算起,到虛基類部分的位元組數)。這是為了之後的菱形繼承的派生類物件能夠定址到共享虛基類部分。

如果a中有虛函式,那麼派生類物件的基類部分應該也有class a的虛表指標

c 物件模型

很久之前就想總結一下c 的記憶體使用機制。直到現在剛考完試之制,去實習之前,才有時間完成這事。1.程式使用記憶體區 乙個程式占用的記憶體區一般分為5種 1 全域性 靜態資料區 儲存全域性變數及靜態變數 包括全域性靜態變數和區域性靜態變數 2 常量資料區 儲存程式中的常量字串等。3 區 儲存程式的 4...

C 物件模型

很久之前就想總結一下c 的記憶體使用機制。直到現在剛考完試之制,去實習之前,才有時間完成這事。1.程式使用記憶體區 乙個程式占用的記憶體區一般分為5種 1 全域性 靜態資料區 儲存全域性變數及靜態變數 包括全域性靜態變數和區域性靜態變數 2 常量資料區 儲存程式中的常量字串等。3 區 儲存程式的 4...

C 物件模型

簡單物件模型 乙個c 物件儲存了所有指向成員的指標,而成員本身不儲存在物件中。也就是說不論資料成員還是成員函式,也不論這個是普通成員函式還是虛函式,它們都儲存在物件本身之外,同時物件儲存指向它們的指標。示意圖如右。簡單物件模型對於編譯器來說雖然極盡簡單,但同時付出的代價是空間和執行期的效率.顯而易見...