为什么这个虚拟方法不能内联?
Why can't this virtual method be inlined?
我读到,用简化的术语来说,如果C++编译器可以证明变量是某种类型的,它就可以内联虚函数。为什么在这种情况下它不能做到这一点(使用 MSVC 2017、clang 4.0、gcc 7.2 和 icc 17 进行测试(:
#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:
const Callable caller;
};
class Methods {
public:
constexpr static const Call c {Square()};
};
int main() {
using std::cout;
cout << Methods().c.caller.sq(5);
}
我注意到 clang 在 godbolt 中的优化输出(下面的链接(说Callable::sq
不会被内联,因为它的定义不可用。但是,Methods::c
是static
和const
.Call::caller
也是const
.此外,Square::sq
final
.据我所知,它们不可能在运行时更改。还是我错过了什么?
另一方面,编译器能够在此版本中内联函数:
#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 {}
相关文章:
- 不能将方法返回的值用于另一个方法
- 为什么我们不能直接使用类模板来推导方法模板?荸荠属
- 返回实例变量的c++方法可以访问变量中的数据,但不能更改它,但在编译时不会生成错误
- 为什么这个虚拟方法不能内联?
- 回调方法显示错误,类型为"void(*)"的值不能用于初始化类型的实体
- 为什么我不能在未链接的 DLL 上调用方法,但可以这样做?C++
- 为什么我们不能同时实现两个方法'getAB() &&'和'getAB()'?
- 不能在复制构造函数中隐式调用的方法
- C++ 特征:为什么可以为方法添加赋值,但不能为方法添加 Diagonal()
- C 不能将对象设置为方法的返回对象
- 不能使用运算符<<作为方法?
- 不能和正确的方法来声明类成员 c++11 中的 int 数组数组
- std::异步不能调用受保护的基类方法
- JetBrains CLion 不能建议字符串的成员方法
- 我的类中有方法的指针数组,但我不能调用我的方法.代码如下
- STL 中的排序方法不能交换向量中的内容
- 当丢失非const虚拟方法时,为什么我不能实例化类的const实例
- 不能只删除方法的常量重载?
- 为什么我不能在方法中按名称引用类的实例?
- 类模板:为什么我不能将单一方法专用于空类型?