我有一个关于优化虚函数调用的问题。我在某处读过(问题是我现在找不到这篇文章),可以通过使用类似于以下的构造来优化 v-table 查找:
// Base.h
class Base
{
public:
virtual void Foo() = 0;
};
// Concrete.h
class Concrete : public Base
{
public:
virtual void Foo()
{
// do something;
}
};
//Some.h
extern Base* const g_object;
// Some.cpp
Concrete on_stack_concrete;
Base* const g_object = &on_stack_concrete;
诀窍应该是使用指向分配在堆栈上的变量的 const 指针(不是动态的),并且编译器肯定会优化它。因此,每当用户调用 g_object->Foo() 时, //do something 部分将被执行,而无需查找 v-table。
这是真的还是假的?
提前感谢任何重播。
编辑:
这种构造的可能用途是限制具体实现的接口。当然,人们可以争辩说“受限”方法应该是私有的,但有时库的其他模块需要访问对象的那些公共附加方法,而不允许用户操作这些方法。因此,例如使用#defines,可以创建类似于以下内容的代码:
// Some.cpp
#ifdef _WIN32
Win32Concrete concrete;
#elif defined _UNIX
UnixConcrete concrete;
#endif
Base* const g_global = &concrete;
事实上,这些类的声明只能在 CPP 文件中定义,因此用户不知道它们的存在。
问题不是首先为什么要使用这样的常量指针,而是在这种情况下是否可以优化 v-table 查找。