VC8 を使用して、次のような 2 つのモジュールを作成します。
ヘッダ
class IFoo
{
virtual void Bar() = 0;
};
モジュール A
extern IFoo& Foo;
void DoStuff()
{
Foo.Bar();
}
モジュール B
IFoo& Foo = ConcreteFoo();
VC8 は、基本的に 'Foo' を IFoo へのポインタとして扱うことでこれを処理します。Foo.Bar() を見つけると (モジュール B であっても)、ポインターを逆参照してオブジェクトの vtable を取得し、Bar() のアドレスを検索して呼び出します。Foo は実際には具体的なオブジェクトを参照し、常に参照するため、これは少しイライラします。以下のようなことができれば良いです。
モジュール A
extern __concrete IFoo& Foo;
これにより、この参照を裏付ける具体的なオブジェクトを提供することを約束することがコンパイラに伝えられます。次に、Foo.Bar() への特別な外部参照を生成し、二重参照解除なしでメソッドを直接呼び出すことができます。
私が知る限り、Visual C++ でこれを行う方法はなく、次の 2 つの疑問が生じます。
- VC コンパイラにダイレクト メソッド呼び出しを生成させる方法はありますか?
- それを実行できる他の C++ コンパイラはありますか?