我想知道是否存在编译器不需要将 vptr 分配给实例化对象的可能优化,即使该对象的类型是具有虚方法的类。
例如考虑:
#include <iostream>
struct FooBase
{
virtual void bar()=0;
};
struct FooDerived : public FooBase
{
virtual void bar() { std::cout << "FooDerived::bar()\n"; }
};
int main()
{
FooBase* pFoo = new FooDerived();
pFoo->bar();
return 0;
}
在这个例子中,编译器在编译时肯定知道 pFoo 的类型,所以它不需要为 pFoo 使用 vptr,对吧?是否有更多有趣的情况,编译器可以避免使用 vptr?
基于 Andrew Stein's answer ,因为我想你也想知道什么时候可以避免所谓的“虚函数的运行时开销”。 (存在开销,但它很小,几乎不值得担心。)
确实很难避免 vtable 指针的 space,但可以忽略指针本身,包括在您的示例中。因为 pFoo 的初始化在那个范围内,所以编译器知道 pFoo->bar
一定意味着 FooDerived::bar,而不是需要检查vtable。还有几种缓存技术可以避免多次 vtable 查找,从简单到复杂。
我是一名优秀的程序员,十分优秀!