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/