接口的使用是否会减慢程序速度?

问题描述:

可能重复:
What is the performance cost of having a virtual method in a C++ class?接口的使用是否会减慢程序速度?

难道接口减慢程序?我听说过这种情况,因为在运行期间,每次使用实现此接口的对象时,必须决定实现此对象所属接口的哪个类。

我特别感兴趣的是C++的答案,但也是一般。如果这是真的,一些数字也会有帮助。

非常感谢!

虽然比利指出这很像other post on SO,但我认为它不完全一样......主要是因为这个问题措辞的方式。

因为奥尔加谈到一个“决定”,我几乎认为她在使用接口和使用派生类之间混淆了,并且通过dynamic_cast确定指向该对象的指针是否属于特定类。

如果您正在讨论使用dynamic_cast,那么根据我的理解(并且这不是基于具体的性能数字),您将获得相当显着的性能。

如果你正在谈论使用接口,那么我觉得做一个vtable查找和额外的调用的次要攻击远远胜过一个更好的软件设计。

是的,但不是很重要,如果您需要接口需要的灵活性,那么这些并不重要。 (请记住,如果您使用的是大量接口,则vtables的相关位将以L1或L2缓存结束,因此几乎不会像您担心的那样多。)

+0

+1 L1和L2缓存 - 有趣的,相关的和新的 – Elemental 2010-04-26 14:37:41

动态分派(即使用虚拟功能)比直接呼叫更昂贵。

但它必须是一个不寻常的计划,因为这是性能限制器。更可能限制性能的是磁盘/网络访问,更新UI或内存带宽等。

如果您使用接口模式(即C++中的抽象类),那么是的,虚拟函数调用会有开销。但是如果你实现了你自己的非抽象类机制来实现同样的目标,你也会有一个开销,可能比VF的调用要大。所以实际上,没有额外的开销。

你可能在谈论C++中的虚拟继承。如果在关键代码路径中不使用虚拟类,性能损失很小。基本上开销与额外的函数调用相同。