編譯器內部轉換為同效能的非成員函數:
float Point3d::magnitude() const { ... }
// →
float magnitude_7Point3dFv(const Point3d* this) { ... }
obj.magnitude(); // → magnitude_7Point3dFv(&obj)
Name mangling 編碼參數型別確保連結期型別安全 (不含回傳型別)。
normalize_7Point3dFv)。ptr->z() 轉為 (*ptr->vptr[4])(ptr)。pure_virtual_called 佔位。this 指標,位址型別為普通函數指標 unsigned int (*)(),常用作回呼。(Class*)0 滿足呼叫慣例。問題:經由第二基類指標呼叫虛函數需調整 this。
{offset, faddr},所有虛呼叫付出額外開銷。this 再跳轉。虛表槽存 Thunk 位址,無調整需求的函數直接存函數位址。pbase2_dtor_thunk:
this += sizeof(Base1);
Derived::~Derived(this);
機制極度複雜,建議:虛基類**不宣告非靜態資料成員**。
(*ptr->vptr[(int)pmf])(ptr)。struct _mptr {
int delta; // this 調整位移
int index; // 虛表索引 (-1 表非虛)
union { ptrtofunc faddr; int v_offset; };
};