据我了解,如果编译器在编译时知道对象在运行时的类型(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;
}
编辑:
我认为我原来的示例代码实际上不能很好地表达我想问的问题。我已经更新了代码,但问题仍然存在。
最佳答案
编译器永远需要内联函数调用。在这种情况下,允许内联函数调用,因为它知道 c
的具体类型(因为它不是通过指针或引用间接定向的,编译器可以查看它作为 child
分配的位置)。这样,编译器就知道使用了print()
的哪个实现,可以选择不进行vtable间接寻址,进一步选择内联函数的实现。
但是,编译器也可以不内联它;它可能会插入对 child::print()
的直接调用,或通过 vtable 间接调用,如果它决定这样做的话。
这些优化通常归结为“as-if”规则 - 编译器必须表现得as-if 它正在间接执行完整的 vtable - 这意味着结果 必须相同,但如果结果相同,编译器可以选择不同的方法来实现结果。这包括内联等。
关于c++ - 子类可以内联一个不在基类中内联的纯虚方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7601256/