【发布时间】:2011-06-12 02:14:50
【问题描述】:
简而言之: 从指向派生类实例的 C++ 基类指针,如何在运行时确定非纯虚函数(在基类)是否在派生类中重新实现?
上下文:
我正在编写一个 C++ 库来解决某些类别的数学方程。该库提供了一个带有多个虚函数的Equation 类,库用户将其用作他们希望求解的特定方程的基类。该库还提供了一个Solver 类,它将Equation * 作为构造函数参数。然后用户编写代码如下:
class MyEquation : public Equation
{ ... } // equation definition here
int main()
{
MyEquation myEqn;
Solver solver(&myEqn);
solver.Solve();
}
如果Equation 中的某些虚函数组合未在派生方程类中重新定义,则可以省略Solver 对象运行的算法中某些计算量大的部分。因此,我想知道,在Solver 的构造函数中,哪些函数已被重新定义,哪些函数将运行Equation 中的默认实现。
我想让这对库的用户透明,所以我不是在寻找解决方案,例如,用户在派生方程的构造函数中设置一些标志,指定哪些函数已被重新定义。
一种可能的解决方案是
Equation中的虚函数的默认实现在Equation类中设置私有标志;然后Solver类的构造函数可以清除这个标志,运行虚函数,并检查标志值以查看Equation中的实现是否已被调用。不过我想避免这种情况,因为每次执行虚函数时简单地设置标志会大大降低算法的速度(这些虚函数的执行对程序的运行时间有很大贡献,默认实现只是返回一个常数)。
【问题讨论】:
-
你确定设置一个标志有什么不同吗?我想它与调用虚函数调用的开销相比完全可以忽略不计。
-
这似乎高度依赖于架构。对于这个程序,在作为目标机器的 64 位 Xeon 服务器上,虚拟函数调用的开销似乎几乎为零。然而,在我的家用计算机(32 位 Athlon)上,正如您所怀疑的那样,函数调用开销远大于设置标志的时间。
-
首先是否需要确定虚拟是否具有覆盖让您觉得完全正交于多态性?它确实对我有用。换句话说,如果你需要这样做,你的设计就会被破坏。
-
@John:优化经常与好的设计直接对立。对于大多数程序,平衡强烈支持良好的设计(可能以边际减速为代价)。对于像这样一个
-
@Chris:我明白了。但是没有程序需要性能如此糟糕以至于编写不正确代码是可以的。你根本无法做你想做的事。至少不是直接的。
标签: c++ virtual-functions