一個C++程序員,想要進一步提升技術水平的話,應該多了解一些語言的語意細節。對於使用VC++的程序員來說,還應該了解一些VC++對於C++的诠釋。Inside the C++ Object Model雖然是一本好書,然而,書的篇幅多一些,又和具體的VC++關系小一些。因此,從篇幅和內容來看,譯者認為本文是深入理解C++對象模型比較好的一個出發點。
這篇文章以前看到時就覺得很好,舊文重讀,感覺理解得更多一些了,於是產生了翻譯出來,與大家共享的想法。雖然文章不長,但時間有限,又若干次在翻譯時打盹睡著,拖拖拉拉用了小一個月。
一方面因本人水平所限,另一方面因翻譯時經常打盹,錯誤之處恐怕不少,歡迎大家批評指正。
前言
了解你所使用的編程語言究竟是如何實現的,對於C++程序員可能特別有意義。首先,它可以去除我們對於所使用語言的神秘感,使我們不至於對於編譯器干的 活感到完全不可思議;尤其重要的是,它使我們在Debug和使用語言高級特性的時候,有更多的把握。當需要提高代碼效率的時候,這些知識也能夠很好地幫助 我們。
本文著重回答這樣一些問題:
* 類如何布局?
* 成員變量如何訪問?
* 成員函數如何訪問?
* 所謂的“調整塊”(adjuster thunk)是怎麼回事?
* 使用如下機制時,開銷如何:
* 單繼承、多重繼承、虛繼承
* 虛函數調用
* 強制轉換到基類,或者強制轉換到虛基類
* 異常處理
首先,我們順次考察C兼容的結構(struct)的布局,單繼承,多重繼承,以及虛繼承;接著,我們講成員變量和成員函數的訪問,當然,這裡面包含虛函 數的情況;再接下來,我們考察構造函數,析構函數,以及特殊的賦值操作符成員函數是如何工作的,數組是如何動態構造和銷毀的;最後,簡單地介紹對異常處理 的支持。
對每個語言特性,我們將簡要介紹該特性背後的動機,該特性自身的語意(當然,本文決不是“C++入門”,大家對此要有充分認 識),以及該特性在微軟的VC++中是如何實現的。這裡要注意區分抽象的C++語言語意與其特定實現。微軟之外的其他C++廠商可能提供一個完全不同的實 現,我們偶爾也會將VC++的實現與其他實現進行比較。
類布局
本節討論不同的繼承方式造成的不同內存布局。
1、C結構(struct)
由於C++基於C,所以C++也“基本上”兼容C。特別地,C++規范在“結構”上使用了和C相同的,簡單的內存布局原則:成員變量按其被聲明的順序排 列,按具體實現所規定的對齊原則在內存地址上對齊。所有的C/C++廠商都保證他們的C/C++編譯器對於有效的C結構采用完全相同的布局。這裡,A是一 個簡單的C結構,其成員布局和對齊方式都一目了然。
struct A {
char c;
int i;
};