1

可能重复:
虚函数和性能 - C++

我有一些课:

class I
{
public:
  virtual void foo() = 0;
protected:
  virtual ~I(){}
};

该类不提供实例删除的接口,因此使析构函数受保护是很合乎逻辑的解决方案。因此,没有必要将析构函数设为虚拟。但我有虚拟化的代码。

这看起来不是一个大错误,但它对代码性能有很大影响吗?当我们创建虚函数时,我们在虚函数表中添加了一条记录,当我们进行虚调用时,我们在该表中进行搜索。所以这意味着查找时间增加了。我对吗?

4

3 回答 3

5

即使这是一个问题(它不是),不,它不会增加时间。查找实际上并不是运行时查找任何东西——vftable 有多大并不重要。它确切地知道在表内跳转的位置。

所以 - 调用一个virtual方法有一些成本 - 实际查找没有成本。

于 2013-01-06T21:22:53.760 回答
2

通常,您应该始终像virtual使用多态类一样声明析构函数。否则,您将遇到以下经典问题:

Base *derived = new Derived();
delete derived;

与代码中存在潜在问题相比,对性能的担忧肯定是无关紧要的。今天你不需要删除对象,也许明天你会,如果你忘记了这一点,你最终会产生微妙的错误。

调用的成本是virtual存在的,但除非每秒调用数百万个虚拟方法,否则您永远不必担心。

虽然在 vtable 中查找方法不是运行时操作,但它是编译时操作。编译后,您的代码已经知道 vtable 的哪个索引被指定的方法占用。花费的时间是从vtable中间接获取函数的地址。

于 2013-01-06T21:24:43.767 回答
0

很好的答案。虚函数调用的成本就像猿猴身上的一根头发。

然而,析构函数通常可能很慢,虚拟与否,因为它真的很容易使你的数据和类结构过于复杂,所以当你删除一些东西时,它可以运行你甚至没有意识到的 27 米的软件正在做。

于 2013-01-06T23:16:29.167 回答