我有一个关于虚函数调用优化的问题。我在某处读到过(但现在找不到这篇文章了)可能可以通过使用类似于以下结构来优化掉 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”部分将被执行,无需进行虚函数查找。
这是真的还是假的?
提前感谢任何回复。
编辑:
这种构造的可能用途是限制具体实现的接口。当然,有人会认为“受限”方法应该是私有的,但有时库的其他模块需要访问对象的这些公共附加方法,而不允许用户操纵它们。因此,例如使用#define,可以创建类似于以下代码的代码:
// Some.cpp
#ifdef _WIN32
Win32Concrete concrete;
#elif defined _UNIX
UnixConcrete concrete;
#endif
Base* const g_global = &concrete;
事实上,这些类的声明只能在CPP文件中定义,因此用户不知道它们的存在。
问题不在于为什么要首先使用这样的常量指针,而是是否有可能优化掉这种情况中的虚函数表查找。