我有一個關於虛擬函數調用優化的問題。我已閱讀的地方(而問題是,現在我無法找到文章),這可能是通過使用一個類似的結構來優化掉V-查表:虛擬函數調用的優化
// Base.h
class Base
{
public:
virtual void Foo() = 0;
};
// Concrete.h
class Concrete : public Base
{
public:
virtual void Foo()
{
// do something;
}
};
//Some.h
extern Base* const g_object;
// Some.cpp
Concrete on_stack_concrete;
Base* const g_object = &on_stack_concrete;
訣竅應該使用一個const指針指向一個在堆棧上分配的變量(不是動態的),編譯器肯定會優化它。因此,無論用戶何時調用g_object-> Foo(),都可以執行部分操作,而無需v-table查找。
這是真的嗎?
預先感謝任何重播。
編輯:
這種構建體的可能的使用是限制具體實現的接口。當然,人們可以爭辯說,「受限制」的方法應該是私有的,但有時圖書館的其他模塊需要訪問對象的公共附加方法,而不允許用戶操縱這些方法。因此,例如使用#定義,我們可以創建類似的代碼:因此
// Some.cpp
#ifdef _WIN32
Win32Concrete concrete;
#elif defined _UNIX
UnixConcrete concrete;
#endif
Base* const g_global = &concrete;
事實上這些類的聲明只能在CPP文件中定義,用戶不知道它們的存在。
問題不是爲什麼首先使用這樣的常量指針,但是如果可以在這種情況下優化掉v-table查找。
這可能是編譯器相關的,你應該能夠驗證這看你的編譯器生成的程序集 – marcinj
爲什麼使用指針,如果它總是指向同一個對象? –
@BoPersson,我現在可以想到一個好的應用程序,例如跨平臺庫,僅向用戶公開抽象接口,而後端根據某些#defines針對各種平臺使用多個實現。這當然需要對具有不同定義集合的每個平臺進行多次編譯,但對於最終用戶來說,這沒有什麼不同。 –