我正在尝试重构我的代码,而且每个人都说使用虚拟函数是一个非常性能的huuuuge,为什么呢?还有另一种方法可以继承一个类并重新定义在基类中定义的函数吗?
答案 0 :(得分:3)
可以在此处找到有关此主题的优秀参考文章:http://coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/3
对于懒惰,我猜答案是“可能稍微慢一些”
答案 1 :(得分:1)
虚函数通过vtable调用,它基本上是一个函数指针数组。因此,每次调用一个,都会有额外的数组查找。我不确定我是否称之为 huuuuge nono,但一般来说它们应该非常快。
来自维基百科:
虚拟呼叫至少需要一个额外的索引取消引用,和 与非虚拟呼叫相比,有时会增加“修正” 只需跳转到编译指针即可。因此,调用虚拟 函数本质上比调用非虚函数慢。一个 1996年完成的实验表明约占6-13% 执行时间花在简单调度到正确的函数上, 虽然开销可高达50%。[4]虚拟的成本 由于太多,现代CPU架构上的功能可能不是那么高 更大的缓存和更好的分支预测。