1

我有一个虚拟类Calculator和该类的示例实现MyCalculator

template <class T>
class Calculator{
    virtual void op1() = 0;
};

template <class T>
class MyCalculator : public Calculator{
    void op1(){ do_something(); }
};

当我使用op1()如下函数演示时,编译器当然不能内联op1(),因为它是虚拟的:

void calculate(Calculator* calc){
    calc->op1();
}

然而,在某些情况下,我知道calcAND 的实际类型,出于性能原因我想内联它。于是我想到了下面的想法:

template <class C>
void calculate(C* calc){
    calc->op1();
}

我会调用这个函数,如下所示:

Calculator c1 = new Calculator();
calculate(c1); // no inling possible in calculate(...)

MyCalculator c2 = new MyCalculator();
calculate(c2); // inlining possible in calculate(...) ?

在第一个示例中,内联是不可能的,但我认为在第二个示例中,op1()ofMyCalculator应该内联 inside calculate()

我的假设是真的吗?

4

2 回答 2

5

您可以像在 C++11 中一样标记虚函数,final这意味着您不能在更派生的类中覆盖它。然后编译器可以内联这个函数。否则编译器不能保证你没有使用具有不同覆盖的更派生类型调用它,因此它不能内联。

于 2015-05-31T15:08:58.967 回答
0

您可以启用 LTO,

https://gcc.gnu.org/wiki/LinkTimeOptimization ,

从我读过的内容(但我自己还没有测试过),如果链接器可以检测到实际的预期实现,LTO 可以区分虚拟调用,因此当时链接器也可以决定内联函数

于 2015-05-31T15:17:26.340 回答