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

也许它可以——这将取决于编译器的智能和优化要求。

但是,这是一个电话。你为什么关心优化这个调用?而且,如果您确实关心,为什么不为这个电话选择正确的类型呢?

关于优化的所有问题的第一个答案是“为什么需要优化它?” 有一个性能工具报告说 50% 的应用程序时间是一个地方,并且问题得到了回答。“哦,但它效率低下”,最常见的回答会导致无法维护的代码很少优化实际上效率低下的代码。

于 2012-09-13T16:59:47.770 回答