0

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 つの疑問が生じます。

  1. VC コンパイラにダイレクト メソッド呼び出しを生成させる方法はありますか?
  2. それを実行できる他の C++ コンパイラはありますか?
4

1 に答える 1

3
  1. プロファイリングでボトルネックであることが示されない限り、1つの小さなvtableルックアップについて心配する必要はありません。(ヒント:おそらくそうではないでしょう。)
  2. コンパイラは、具体的な戻り型がどうなるかをどのように知る必要がConcreteFoo()ありますか?Foo::Bar()が仮想の場合、コンパイル時にのタイプが不明であるFoo.Bar()ため、コンパイラはへの静的呼び出しを作成できません。Foo
  3. たとえば、の実際のタイプがわかっている場合は、参照を削除できます。FooBiz

    モジュールA

    extern Biz Foo;
    

    モジュールB

    Biz Foo = ConcreteFoo();
    

    Biz(コピーコンストラクターがあると仮定します。)

于 2010-02-04T21:46:24.990 に答える