參考自
原文中物件記憶體布局有誤(圖中虛表指標應在對應成員變數之前),但虛表的內容可以參考
單一繼承
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 物件儲存了所有指向成員的指標,而成員本身不儲存在物件中。也就是說不論資料成員還是成員函式,也不論這個是普通成員函式還是虛函式,它們都儲存在物件本身之外,同時物件儲存指向它們的指標。示意圖如右。簡單物件模型對於編譯器來說雖然極盡簡單,但同時付出的代價是空間和執行期的效率.顯而易見...