c 動態繫結的解析及虛函式帶來的開銷

2021-06-28 23:18:09 字數 756 閱讀 6790

每個支援虛函式的類(基類或派生類)都會有乙個其所有支援的虛函式指標的虛函式表,每個該類生成的物件都會隱含乙個虛函式指標,此指標指向其所屬類的虛函式表,當通過基類的指標或引用呼叫每個虛函式時,系統首先定位這個指標或引用真正對應的物件所隱含的虛函式指標,然後虛函式指標會根據這個虛函式的名稱,對這個虛函式指標指向的虛函式表進行乙個偏移定位,再呼叫這個偏移定位處的函式指標對應的虛函式,這就是動態繫結整個執行過程

虛函式的開銷

空間開銷

1.每個支援虛函式的類,都有乙個虛函式表,虛函式表的大小和該類擁有的虛函式個數多少成正比,此虛函式表對乙個類來說,而無論該類生成多少物件執行是會生成多少個

,整個程式只有乙個

2.支援虛函式的類在每生成乙個物件時都會有乙個指向該類對應虛函式表的虛函式指標,無論虛函式有多少,都會只有乙個虛函式指標,因為與物件繫結,因此程式執行時虛函式指標引起的空間開銷跟生成的物件個數成正比

時間開銷

1. 支援虛函式的類生成的每個物件,當其生成時在建構函式中會呼叫編譯器在建構函式內部插入的初始化**,來初始化其虛函式指標,使其指向正確的虛函式表

2.通過指標或引用呼叫虛函式時,跟普通函式呼叫相比,會多乙個根據虛函式指標主找到虛函式表的操作

如果想利用虛函式動態繫結帶來的優勢必須放棄內聯函式帶來的速度優勢

原因:內聯函式是在編譯期間編譯器將呼叫內聯函式的地方使用其內聯函式體的**代替 ,虛函式本質上是執行期的行為,在編譯期無法知道某處的虛函式在真正執行的時候會呼叫到那個具體的實現

c 規避虛函式的動態繫結

如果我們希望明確指定呼叫 基類 還是 子類的虛函式版本。那麼可以通過作用域運算子 注 這一特性是設計模式中 責任鏈模式 的核心實現手段。class a class b public a int tmain int argc,tchar ar 這個特性非常有用,當很多派生類 都用相同動作時,我們可以把...

虛函式和動態繫結 C 學習

1.什麼是虛成員函式 即其宣告在返回型別的前面帶有關鍵字virtual的類成員函式。定義為virtual的函式是基類期待派生類重新定義的,基類希望派生類繼承的函式不能定義為虛函式。2.動態繫結 通過動態繫結,我們能夠編寫程式使用繼承層次中任意型別的物件,無須關心物件的具體型別。在c 中,通過基類的引...

虛函式和動態繫結 C 學習

1.什麼是虛成員函式 即其宣告在返回型別的前面帶有關鍵字virtual的類成員函式。定義為virtual的函式是基類期待派生類重新定義的,基類希望派生類繼承的函式不能定義為虛函式。2.動態繫結 通過動態繫結,我們能夠編寫程式使用繼承層次中任意型別的物件,無須關心物件的具體型別。在c 中,通過基類的引...