想要進階提升技術實力的 C++ 程式設計師,必須深入理解語言的語意細節。對於使用 VC++ 的開發者而言,更應掌握 VC++ 對 C++ 標準的具體實作細節。雖然《Inside the C++ Object Model》是經典好書,但篇幅較長且與 VC++ 具體實作關聯較小。本文從篇幅與內容深度來看,是深入理解 C++ 物件模型的絕佳切入點。
譯者舊文重讀,理解更深,遂將其翻譯分享。雖文章不長,但因水平有限且翻譯過程常打盹,拖延近一個月才完成。錯誤之處在所難免,歡迎批評指正。
了解所用程式語言的底層實作機制,對 C++ 程式設計師尤為重要。首先,它能消除對語言的神秘感,讓我們不再對編譯器的行為感到不可思議;更重要的是,它能讓我們在除錯與使用進階語言特性時更有把握。當需要優化程式碼效能時,這些知識也能提供有力幫助。
本文將依序探討:C 相容結構體的記憶體佈局、單一繼承、多重繼承、虛擬繼承;接著說明成員變數與成員函數的存取機制(含虛擬函數);隨後分析建構函數、解構函數、特殊指派運算子的運作方式,以及陣列的動態建構與銷毀;最後簡介例外處理的支援機制。
對每項語言特性,將簡述其設計動機、語意規範(本文非 C++ 入門教材),以及在 Microsoft VC++ 中的具體實作。需特別區分抽象的 C++ 語言語意與特定實作之差異。其他 C++ 廠商可能提供完全不同的實作,本文偶爾會將 VC++ 實作與其他實作比較。
C++ 基於 C,因此「基本上」相容 C。C++ 標準對「結構體」採用與 C 相同的簡單記憶體佈局原則:成員變數按宣告順序排列,依具體實作規定的對齊原則在記憶體位址上對齊。所有 C/C++ 廠商都保證其編譯器對有效 C 結構體採用完全相同的佈局。以下簡單結構體 A 的成員佈局與對齊一目了然:
struct A {
char c;
int i;
};