【发布时间】:2012-12-20 15:28:58
【问题描述】:
我有一些课:
class I
{
public:
virtual void foo() = 0;
protected:
virtual ~I(){}
};
该类不提供删除实例的接口,所以将析构函数设为protected是很合乎逻辑的解决方案。因此,没有必要将析构函数设为虚拟。但我有虚拟化的代码。
这看起来不像是一个大错误,但它对代码性能有显着影响吗? 当我们创建虚函数时,我们向虚函数表中添加了一条记录,当我们进行虚调用时,我们在该表中进行搜索。所以这意味着查找时间增加了。我对吗?
【问题讨论】:
-
vcall 的开销确实很小。它不像一个大表查找——它只是另一个指针取消引用。因此,在这里或那里只删除它的一个实例,vcall 的开销将可以忽略不计。如果它发生在一个紧密的循环中,那么您可能会关心 - 但此时唯一知道的方法就是对其进行基准测试。
-
如果调用是在多态上下文中,你只做一次表查找。听起来好像不是这里的情况,所以应该没有间接性。
标签: c++ performance