【发布时间】:2010-10-14 15:15:41
【问题描述】:
在 C++ 类(或其任何父类)中至少有一个虚拟方法意味着该类将有一个虚拟表,并且每个实例都有一个虚拟指针。
所以内存成本是很清楚的。最重要的是实例的内存成本(特别是如果实例很小,例如,如果它们只包含一个整数:在这种情况下,在每个实例中都有一个虚拟指针可能会使实例的大小加倍。至于虚拟表占用的内存空间,我想与实际方法代码占用的空间相比,它通常可以忽略不计。
这让我想到了我的问题:使方法虚拟化是否存在可衡量的性能成本(即速度影响)?在运行时,每次方法调用都会在虚拟表中进行查找,所以如果对这个方法的调用非常频繁,并且如果这个方法很短,那么可能会对性能造成可测量的影响?我想这取决于平台,但有人运行过一些基准测试吗?
我问的原因是我遇到了一个错误,该错误恰好是由于程序员忘记定义虚拟方法所致。这不是我第一次看到这种错误。我想:为什么我们在需要时添加 virtual 关键字,而不是在我们绝对确定 不需要 需要 virtual 关键字时删除 ?如果性能成本低,我想我会在我的团队中简单地推荐以下内容:只需在每个类中默认将 every 方法设置为虚拟,包括析构函数,仅在需要时将其删除.你觉得这听起来很疯狂吗?
【问题讨论】:
-
比较虚拟呼叫和非虚拟呼叫并不重要。它们提供不同的功能。如果要将虚函数调用与 C 等效项进行比较,则需要添加实现虚函数等效功能的代码的成本。
-
这是一个 switch 语句或一个大的 if 语句。如果你很聪明,你可以使用函数指针表重新实现,但出错的可能性要高得多。
-
问题是关于不需要虚拟的函数调用,所以比较是有意义的。
标签: c++ performance virtual-functions