- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个关于虚函数调用优化的问题。我在某处读到(问题是我现在找不到这篇文章),可以通过使用类似于此的构造来优化 v 表查找:
// 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;
诀窍应该是使用一个常量指针指向在堆栈上分配的变量(不是动态的),并且编译器肯定会优化它。因此,每当用户调用 g_object->Foo() 时,//do something 部分将被执行,而无需查找 v 表。
这是真的还是假的?
提前感谢您的重播。
编辑:
这种构造的可能用途是限制具体实现的接口(interface)。当然,有人会争辩说“受限”方法应该是私有(private)的,但有时库的其他模块需要访问对象的那些公共(public)附加方法,而不允许用户操作这些方法。因此,例如使用#defines,可以创建类似于以下的代码:
// Some.cpp
#ifdef _WIN32
Win32Concrete concrete;
#elif defined _UNIX
UnixConcrete concrete;
#endif
Base* const g_global = &concrete;
实际上这些类的声明只能在CPP文件中定义,因此用户并不知道它们的存在。
问题不是一开始为什么要使用这样的常量指针,而是在这种情况下是否有可能优化 v-table 查找。
最佳答案
您似乎在滥用 virtual
。
virtual
实现运行时多态性。而且您描述的场景不使用或不需要它。 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
现在您的函数不需要是虚拟的。
关于c++ - 虚函数调用优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12543870/
我有一个特别的问题想要解决,我不确定是否可行,因为我找不到任何信息或正在完成的示例。基本上,我有: class ParentObject {}; class DerivedObject : publi
在我们的项目中,我们配置了虚 URL,以便用户可以在地址栏中输入虚 URL,这会将他们重定向到原始 URL。 例如: 如果用户输入'http://www.abc.com/partner ',它会将它们
我是一名优秀的程序员,十分优秀!