c++ - 虚函数可以内联吗

标签 c++ class inline virtual-destructor

<分区>

如果我这样定义一个类:

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/

相关文章:

c++ - 二进制 '[' : no operator found which takes a left hand operand of type 'const SortableVector<int>'

javascript - 我可以选择没有名称或 ID 的输入值吗?

html - 如何使我的 DIV 和 SELECT 元素保持在同一水平面上?

c++ - 我是否需要实现 FileNotFoundError 异常?

c++ - 计算有限面额的变化

c++ - 如何使用模板参数成员的类型?

c++ - 将参数传递给方法时内联初始化整数数组

C++:这是在Windows平台上检查文件存在的最佳方法

c++ - 如何修改静态成员函数中的变量?

javascript - 如何在 Javascript 类内部创建类