仮想関数呼び出しの最適化について質問があります。私はどこかで読んだことがあります(そして問題は今記事が見つからないことです)これに似た構造を使用することでv-tableルックアップを最適化できるかもしれません:
// 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()を呼び出すと、//do何かの部分がv-tableルックアップを必要とせずに実行されます。
それは本当ですか?
リプレイをよろしくお願いします。
編集:
このような構成の可能な使用法は、具体的な実装のインターフェースを制限することです。もちろん、「制限された」メソッドはプライベートである必要があると主張することもできますが、ライブラリの他のモジュールは、ユーザーがそれらを操作できるようにすることなく、オブジェクトのパブリック追加メソッドにアクセスする必要がある場合があります。したがって、たとえば#definesを使用すると、次のようなコードを作成できます。
// Some.cpp
#ifdef _WIN32
Win32Concrete concrete;
#elif defined _UNIX
UnixConcrete concrete;
#endif
Base* const g_global = &concrete;
実際、これらのクラスの宣言はCPPファイルでのみ定義できるため、ユーザーはそれらの存在に気づきません。
問題は、そもそもなぜそのような定数ポインタを使用するのかではなく、そのようなシナリオでvテーブルルックアップを最適化できるかどうかです。