為什麼 C 中使用虛函式時會影響效率?

時間 2021-05-10 00:20:24

1樓:

C++ 中使用虛函式不會影響效率。你遇到的場景,都沒到需要考慮流水線 friendly 的程度,先把東西寫出來,別想沒用的。

2樓:maple

因為查詢虛函式表的時候會有效率損失,可以通過模板的CRTP技術實現靜態繫結,詳見:

C++ CRTP(Curiously Recurring Template Pattern)簡介

3樓:seek yao

你們把cache和prefetch這兩個概念給混淆了,虛函式、函式指標相比於普通函式呼叫更加難以預取(cpu流水線越長越吃虧),普通函式相比於內聯的開銷在於難以cache命中

4樓:嚴偉

從效率上來說,應該要分成2塊開銷

1.構建虛表

2.呼叫虛表中的函式

從理論上來講,這肯定是增加了額外的開銷

但是從實際應用的過程來說,這點開銷比起你那慘不忍睹的未優化邏輯來說,實在是不值一提

5樓:朱逸之

樓上好多答案真恐怖. 普通函式的位址在你編譯好的01的機器語言裡就有了, 現代的superscalar cpu在處理這種指令上已經很快很優化了. 而virtual call函式的位址在記憶體裡, 需要現調, 沒調好的時候cpu就只能空轉沒法幹別的, 所以慢.

不過上面 @Gemfield 說的對, 理論上的瓶頸現實中經常沒啥, 不要提前優化.

6樓:

誰告訴你會影響效率了?就是增加了幾個指標操作而已,這點開銷可能都比函式的引數入棧操作都小。虛函式本質上沒有嚴格的簽名資訊,其嚴格依賴基類的虛函式的申明順序,而與虛函式本身的名字無關,在呼叫時多了個指標陣列的定址操作。

7樓:尋寒

對於虛函式的呼叫示例:

Object *o = ....;

....

o->do();

編譯器對此的實現(很有可能的一種方式):

(*o->vptr[vfuc_index])(o)也就是說先對物件做一次定址,找到虛表指標,在定址找到虛表指標中對應的函式,再把呼叫者的物件作為引數傳入並執行之。

8樓:白如冰

呼叫虛函式的時候,首先根據物件裡儲存的虛函式表指標,找到虛函式表,再根據偏移量找到哪一項,再找到虛函式位址

按照the C++PL的說法,虛函式呼叫比普通成員函式慢至多25%

為什麼C 繼承過程中使用訪問說明符和虛函式?

首先,繼承過程中使用訪問說明符主要是為了控制繼承下來的成員的訪問性,比如對類A classA 使用不同的繼承方式,對應的成員訪問性如下 classB publicA classC protectedA classD privateA 至於private 繼承 在 B 類裡面,this 還是可以轉成 ...

c 靜態成員函式為什麼不能為虛函式?

Elvis Wang 其實我覺得這個問題沒有回答的必要,屬於語言概念層面的東西。class A 首先你要搞清楚什麼是普通成員函式。成員函式是類例項相關的,不同的例項物件呼叫成員函式結果一般都不同。比如,上面的fun1是成員函式,你進行呼叫 A a1 new A A a2 new A a1 fun1 ...

C 虛函式不能使用模板類有什麼替代方案

XZiar 說白了就是擦除了型別資訊,又想在執行時恢復出來。C 的問題在於,對於模板,每個例項都是不同的函式,且互相沒有聯絡。所以就需要在編譯期確定這個函式模板的例項。到目前為止目標應該就應該很清晰了,每乙個具體的son呼叫哪個foo 都需要一一對應。形成一一對應的方法很多,大致就是 1.if el...