為什麼c++裡呼叫虛函式比呼叫普通函式慢?
原因:
- 執行時需要得到對應類的函式的位址
- 當在用父類的引用或者指標呼叫虛函式時,會先從該物件的頭部取到虛函式的位址(c++標準規定虛函式表位址必須放最前),再從虛函式表中取到實際要呼叫的函式的位址,最終呼叫該函式
- 呼叫虛函式,相比普通函式,實際上多了三條指令:取虛表,取函式位址,call呼叫。
- 影響cpu流水線
- 編譯器不能是內聯函式
-僅當用父類引用或者指標呼叫時,不能內聯
- 因為內聯函式是指在編譯期間用被呼叫的函式體本身來代替函式呼叫的指令,但是虛函式是直到執行時才能知道要呼叫的是哪乙個函式,所以沒法在編譯時進行內聯函式展開。
- 但是當子類直接呼叫虛函式,是可以內聯優化的。
- 單繼承時效能差不多,多繼承的時候會慢
c 多型問題(在虛函式裡呼叫虛函式)
最近在看cocos2d x的原始碼,非常感激cocos2d作者的開源精神。在看 的過程中感覺兩個方向讓我受益,1.把之前從書中看到的c 知識,明白了怎麼運用。2.學習作者駕馭 的巧妙方法。看coco2d x的時候我發現了自己對多型之前不了解的知識,廢話少說上 include include usin...
C 裡的建構函式為什麼不能為虛函式
以下 在編譯時會出錯,原因是建構函式不能為虛函式。1 class student 78 private 9 intdwno 10 那麼建構函式為什麼不能為虛函式呢?這裡你需要知道乙個概念,那就是虛函式表vtbl,每乙個擁有虛成員函式的類都有乙個指向虛函式表的指標。物件通過虛函式表裡儲存的虛函式位址來...
C 建構函式中呼叫虛函式
我們知道 c 中的多型使得可以根據物件的真實型別 動態型別 呼叫不同的虛函式。這種呼叫都是物件已經構建完成的情況。那如果在建構函式中呼叫虛函式,會怎麼樣呢?有這麼一段 class a virtual void func void test public int m ival class b publ...