繼續研讀《深度探索 C++ 物件模型》第四章:函式語意學。C++ 支援三種成員函式:靜態、虛擬、非靜態。各自呼叫方式與作用不同。本章深入剖析編譯器內部如何實現這些機制。
表面上成員函式直接存取資料成員,效率似乎較高。實際上編譯器將其轉換為非成員函式:
this 指標參數,綁定物件實例。this->member 形式。// 原始成員函式
float Point3d::magnitude() const { ... }
// 編譯器內部偽碼
float magnitude__7Point3dFv(register Point3d* const this) {
return sqrt(this->_x * this->_x + this->_y * this->_y + this->_z * this->_z);
}
// 呼叫轉換
obj.magnitude(); // -> magnitude__7Point3dFv(&obj);
結論:非靜態成員函式與外部函式效率相同 (兩鐵球同時落地)。名稱修飾包含類別名與參數列表保證唯一性。
this 指標,不需透過物件呼叫 (可用類別名呼叫)。virtual, const, volatile。解決「需存取靜態資料但不想建立物件」的問題,語意接近非成員函式但受類別作用域限制。
以 public base class 指標/參考指向衍生類物件。消極多態:編譯期完成 (如函式多載);積極多態:執行期透過指標/參考查找衍生類物件並呼叫正確實體。
vptr 指向其類別的 vtable。pure_virtual_called()。ptr->z(); // ptr 為 Base* 指向 Derived 物件
// 1. 透過 ptr->vptr 找到 vtable
// 2. 以 z() 固定索引取得函式位址
// 3. 呼叫該位址 (Derived::z 或 Base::z)
呼叫端不知物件真實型別,只知 vtable 與索引。單一繼承下此機制極高效。判斷類別是否支援多態:檢查是否有虛擬函式。
理解編譯器內部轉換與 vtable 機制,能釐清成員函式效率迷思、靜態與虛擬函式的本質差異,為進階 C++ 開發打下堅實基礎。