为什么可以';这个虚拟方法不能内联吗? 我读到,简单地说,如果C++编译器可以证明变量是某种类型的,它可以内联虚拟函数。为什么在这种情况下它不能这样做(使用MSVC 2017、clang 4.0、gcc 7.2和icc 17测试):
为什么会这样?为便于检查,请参见godbolt。尝试在虚拟函数声明末尾添加{}为什么可以';这个虚拟方法不能内联吗? 我读到,简单地说,如果C++编译器可以证明变量是某种类型的,它可以内联虚拟函数。为什么在这种情况下它不能这样做(使用MSVC 2017、clang 4.0、gcc 7.2和icc 17测试):,c++,C++,为什么会这样?为便于检查,请参见godbolt。尝试在虚拟函数声明末尾添加{} virtual int sq(int n) const {} 什么是“clang的优化视图”?@xaxxon我指的是优化输出。我会修好的。我不确定clang是否是编译器,但它毕竟是godbolt的一个特性。您可以在我提供的链接中看到它,单击“显示优化输出”。它显示了编译器试图优化代码的步骤。仔细看一下,我真的很惊讶它居然能工作caller正在切片一个Square,并且从来没有定义过Callable::sq(多态函
virtual int sq(int n) const {}
什么是“clang的优化视图”?@xaxxon我指的是优化输出。我会修好的。我不确定clang是否是编译器,但它毕竟是godbolt的一个特性。您可以在我提供的链接中看到它,单击“显示优化输出”。它显示了编译器试图优化代码的步骤。仔细看一下,我真的很惊讶它居然能工作
caller
正在切片一个Square
,并且从来没有定义过Callable::sq
(多态函数调用需要通过指针/引用类型调用;完整对象类型(已切片)不会得到多态函数调用)。这可能是未定义的行为。@andre_ss6尝试将sq
设为纯虚拟,您将看到您创建了可调用的实例。在第一个示例中调用sq
时,被调用的方法是Callable
定义,因为您没有Square
的实例。在类型为Callable
@andre\u ss6的变量中有效地分割Square
实例。它无法内联调用,因为没有内联内容。您没有提供可调用::sq
的定义。在第一个示例中调用的函数是Callable::sq
,而不是Square::sq
。
#include <iostream>
class Callable {
public:
virtual int sq(int n) const;
};
class Square : public Callable {
public:
inline int sq(int n) const override final {
return n*n;
}
};
class Call {
public:
Callable const* caller;
};
class Methods {
public:
Call c {new Square()};
};
int main() {
using std::cout;
cout << Methods().c.caller->sq(5);
}
virtual int sq(int n) const {}