c – 虚拟函数调用的优化
作者:互联网
我有一个关于虚函数调用优化的问题.我已经阅读了某个地方(问题是我现在找不到文章)可能有可能通过使用类似于此的构造来优化掉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(),//都会执行某些部分,而无需进行v-table查找.
这是真的吗?
提前感谢任何重播.
编辑:
这种构造的可能用法是限制具体实现的接口.当然,人们可以争辩说“受限制”的方法应该是私有的,但有时库的其他模块需要访问对象的那些公共附加方法而不允许用户操纵它们.因此,例如使用#defines,可以创建类似于以下的代码:
// Some.cpp
#ifdef _WIN32
Win32Concrete concrete;
#elif defined _UNIX
UnixConcrete concrete;
#endif
Base* const g_global = &concrete;
事实上,这些类的声明只能在CPP文件中定义,因此用户不知道它们的存在.
问题不是为什么首先使用这样的常量指针,但是如果可以在这种情况下优化掉v表查找.
解决方法:
你好像在滥用虚拟.
虚拟实现运行时多态.您描述的场景不使用或不需要.在任何编译环境中都不可能存在Win32Concrete和UnixConcrete.
代替:
// Some.cpp
#ifdef _WIN32
Win32Concrete concrete;
#elif defined _UNIX
UnixConcrete concrete;
#endif
Base* const g_global = &concrete;
使用:
// CommonHeader.h
#ifdef _WIN32
typedef Win32Concrete Concrete;
#elif defined _UNIX
typedef UnixConcrete Concrete;
#endif
现在你的功能不需要是虚拟的.
标签:vtable,c,optimization,virtual-functions 来源: https://codeday.me/bug/20190826/1726580.html