据我所知,编译器可以在编译时知道对象的类型在运行时(C++ faq)时内联虚函数调用.
但是,当一个人从基类实现纯虚方法时会发生什么?是否适用相同的规则?下面的函数调用是否会被内联?
class base
{
public:
virtual void print() = 0;
virtual void callPrint()
{
print(); // will this be inline?
}
};
class child : public base
{
public:
void print() { cout << "hello\n"; }
};
int main()
{
child c;
c.callPrint();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
我认为我原来的示例代码实际上是我想要问的不好的代表.我已经更新了代码,但问题仍然存在.
bdo*_*lan 10
编译器永远不需要内联函数调用.在这种情况下,允许内联函数调用,因为它知道具体类型c(因为它没有通过指针或引用间接,编译器可以看到它被分配为a的位置child).因此,编译器知道使用了哪个实现print(),并且可以选择不执行vtable间接,并进一步选择内联函数的实现.
但是,编译器也可以自由地不内联它; child::print()如果它决定这样做,它可以直接调用vtable,或间接通过vtable.
这些优化通常归结为"as-if"规则 - 编译器必须表现为 - 如果它正在执行完整的vtable间接 - 这意味着结果必须相同,但编译器可以选择不同的实现方法结果如果结果相同.这包括内联等