我遇到了麻烦。在规划我的程序时,我考虑了两个版本:
什么更快?为什么呢?
编辑:我需要制作下一个算法:数组应该存储指向不同类方法的指针(它们符合差异游戏对象),例如方法Draw()。
主要任务是存储和调用不同类的方法。
答案 0 :(得分:2)
此时,你可能根本不应该考虑微观优化 - 专注于选择有效的算法,并使你的代码清晰和正确;然后找出阻止它按要求执行的任何瓶颈。话虽如此,如果你发现虚拟调度成为一个问题,这里有一些想法。
这两个不等同 - 第一个(如果我理解你所说的)试图通过显式传递this
之类的指针来模拟非虚拟函数静态函数,可能与非静态等价物一样快。它的行为与虚拟功能不同,因此如果您需要虚拟调度,则无法使用。
非虚函数(几乎可以肯定)比虚函数快一点 - 它更可能被内联,如果没有内联,它可以直接调用而不是在运行时查找。因此,只需在需要虚拟调度时将函数声明为虚拟。
在极端情况下,您可以通过在对象中存储函数指针而不是使用编译器生成的虚拟调度来保存虚拟函数的间接级别。如果您发现虚拟调度是一个严重的问题,那么您应该只做最后的手段,并且您无法明智地重新设计算法以避免它。
答案 1 :(得分:0)
首先,虚拟功能和您提出的建议有所不同 语义。如果您因为不同而需要不同的行为 对象的类型,你不可能做得更好 编译器实现虚函数。如果你不需要 它,然后就是不要声明虚函数。
在你知道性能问题之前不要担心性能问题。
如果在使代码生效后,您确实会发现性能问题
到虚函数调用(通常是因为编译器无法内联)
函数,所以你放弃了随后的所有优化
如果你,你可以准时,准确地避免虚拟功能成本
正确设计课程。假设有问题的功能是
f()
:
class Base
{
virtual void doF() = 0;
public:
void f() { doF(); }
};
class Derived : public Base
{
virtual void doF() { f(); }
public:
void f() { /* ... */ }
};
如果你这样做,并且你有一个紧密的循环你所在的地方
不断在同一个对象上调用f()
,你可以这样做:
void
tightLoop( Base& object )
{
Derived& o = dynamic_cast<Derived&>( object );
for ( /* ... */ ) {
o.f();
}
}
如果这样做,当然只能使用对象调用tightLoop
实际上是Derived
。