<分区>
如果我这样定义一个类:
class A{
public:
A(){}
virtual ~A(){}
virtual void func(){}
};
是不是说虚析构函数和func
是内联的
<分区>
如果我这样定义一个类:
class A{
public:
A(){}
virtual ~A(){}
virtual void func(){}
};
是不是说虚析构函数和func
是内联的
最佳答案
编译器是否选择内联定义为内联的函数完全取决于编译器。一般来说,virtual
函数只有在编译器可以证明静态类型匹配动态类型或者编译器可以安全地确定动态类型时才能被内联。例如,当您使用 A
类型的值时,编译器知道动态类型不能不同,并且可以内联该函数。当使用指针或引用时,编译器通常无法证明静态类型相同,virtual
函数通常需要遵循通常的虚拟分派(dispatch)。然而,即使使用了指针,编译器也可能从上下文中获得足够的信息来知道确切的动态类型。例如,MatthieuM。给出了以下例子:
A* a = new B;
a->func();
在这种情况下,编译器可以确定 a
指向 B
对象,从而调用正确版本的 func()
没有动态调度。不需要动态调度,func()
就可以被内联。当然,编译器是否做相应的分析取决于其各自的实现。
正如 hvd 正确指出的那样,可以通过调用虚函数来规避虚拟分派(dispatch)将完全限定,例如,a->A::func()
,在这种情况下,虚函数可以也被内联。通常不内联虚函数的主要原因是需要进行虚拟分派(dispatch)。然而,通过完整限定,要调用的函数是已知的。
关于c++ - 虚函数可以内联吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18432040/