当我可以将对象的实际类型指定为模板参数时,内联虚函数

Mic*_*ael 1 c++ templates inlining

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

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

template <class T>
class MyCalculator : public Calculator{
    void op1(){ do_something(); }
};
Run Code Online (Sandbox Code Playgroud)

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

void calculate(Calculator* calc){
    calc->op1();
}
Run Code Online (Sandbox Code Playgroud)

但是,在某些情况下,我知道calcAND 的实际类型,因为性能原因需要内联.所以我想到了以下想法:

template <class C>
void calculate(C* calc){
    calc->op1();
}
Run Code Online (Sandbox Code Playgroud)

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

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

MyCalculator c2 = new MyCalculator();
calculate(c2); // inlining possible in calculate(...) ?
Run Code Online (Sandbox Code Playgroud)

在第一个例子,内联是不可能的,但我认为在第二个例子中,op1()MyCalculator应该进去内联calculate().

我的假设是真的吗?

Pup*_*ppy 5

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