5

以下のようなコードで、コンパイラはそれが実際に仮想テーブルルックアップaのインスタンスであると判断し、最適化することができますか?B

#include <iostream>

class A
{
  public:
    virtual void f()
    {
        std::cout << "A::f()" << std::endl;
    }
};

class B : public A
{
  public:
    void f()
    {
        std::cout << "B::f()" << std::endl;
    }
};

int main()
{
    B b;
    A* a = &b;
    a->f();

    return 0;
}

Jonthan Sengとreimaの回答後の追加の質問:gccを使用する場合、vtableルックアップを最適化するためにフラグを使用する必要がありますか?

4

2 に答える 2

7
于 2012-09-13T17:10:13.827 に答える
-2

多分それは可能です-それはコンパイラの賢さと最適化の要件に依存するでしょう。

しかし、これは1回の呼び出しです。なぜこの1回の呼び出しを最適化することに関心があるのですか?そして、気になったら、この1回の呼び出しに適切なタイプを取得してみませんか?

最適化に関するすべての質問に対する最初の答えは、「なぜそれを最適化する必要があるのですか?」です。申請時間の50%が1か所であるというパフォーマンスツールレポートを作成し、質問に回答します。「ああ、でもその非効率的」という最も一般的な答えは、実際には非効率的なコードを最適化することはめったにない、保守不可能なコードにつながります。

于 2012-09-13T16:59:47.770 に答える