我想調用一個虛擬的成員函數(在大多數地方使用繼承來保持簡單),但我想強制使用非虛擬調度來調用它,有時在性能關鍵的地方,並在這些地方確切的類型是已知的編譯時間。出於性能原因,我在虛擬通話性能不佳的平臺上這樣做。對於大多數功能而言,虛擬功能的開銷很好,但有一些功能不是。我想避免重複虛擬和非虛擬的所有功能。在模板中使用非虛擬調度
例子:
class Interface
{
public:
virtual void Do(){}
};
class Implementation: public Interface
{
public:
virtual void Do(){}
};
void DoIt(Interface &func)
{
func.Do();
};
int main()
{
Implementation a;
DoIt(a);
// can DoIt be constructed as a template to avoid virtual dispatch?
return 0;
}
編譯器應該檢測到這種情況並自動使用靜態分派。 –
@dark_charlie:只在最平凡的情況下。非平凡的情況必須被鏈接時間或其他全局優化技術所覆蓋,這些技術在編譯器中並不太普及或者非常年輕,並且在通過難以預測指針/引用來調用虛擬函數的情況下,幾乎沒有編譯器會靜態分派。 –
您可以通過非虛擬的'Implementation :: DoImpl()'實現'Implementation :: Do()',並在性能關鍵的地方調用後者。 –