c++ - 我可以期望这个调用是内联的吗?

标签 c++ g++

A * a = new B();
a->foo();

假设 B 派生 A 并且 foo() 是一个虚函数。这个例子很常见,问题是在某些地方据说编译器不会尝试内联它,而在其他地方则恰恰相反。

我个人看不出这个调用不能内联的原因,因为在编译时很容易判断调用了哪个函数。

编辑 1: 我知道“一般情况”,也知道编译器会考虑很多因素来决定是否内联。如果我询问编译器是否可能内联这个特定调用,问题可能会更好。

我问这个问题的原因是来自 this C++ FAQ 的特别引述其中说:

When the object is referenced via a pointer or a reference, a call to a virtual function cannot be inlined, since the call must be resolved dynamically.

最佳答案

如果编译器能够以某种方式推断出 a 指向的对象是 B 的一个实例(即,如果代码很简单,就像您的示例中那样),那么它可以将调用去虚拟化——尽管不需要这样做。

但要点是,一般来说,调用是在运行时解析的,因为您不知道(编译器也不知道!)对象的动态类型是什么由 a 指向。

换句话说,如果编译器不知道*a的动态类型是什么,因此不知道应该调用哪个foo()函数,直到运行时,不可能将调用去虚拟化并在编译时将其内联。

关于c++ - 我可以期望这个调用是内联的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17362712/

相关文章:

c++ - 为什么 list::push_back 在 VC++ 中比在 g++ 中慢得多?

c++ - 禁用特定包含文件的警告

c++ - 使用 C++,为什么我会收到错误消息 "string subscript out of range"而我知道它不是?或者至少看起来是这样

c++ - 强类型语言能走多远?

c++ - 私有(private)使用基构造函数的声明不是私有(private)的

c++ - 从长远来看,使用调试器和大量使用 C++ 模板是否不兼容?

链接静态库时编译 CUDA 代码

c++ - g++ 在 C++ 中的链接错误

c++ - 多线程访问 unordered_map 时出现运行时错误

c++ - 将 Matlab 句柄类转换为 C++