接口的使用会减慢程序吗?

时间:2010-04-26 14:15:34

标签: c++ interface

  

可能重复:
  What is the performance cost of having a virtual method in a C++ class?

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

我对C ++的答案特别感兴趣,但总的来说也是如此。如果这是真的,那么一些数字也会有所帮助。

非常感谢!

5 个答案:

答案 0 :(得分:3)

是的,但如果您需要接口所需的灵活性,那么并不重要,当然也不够重要。 (请记住,如果你大量使用接口,vtable的相关位将最终进入L1或L2缓存,因此几乎不会像你担心的那样多。)

答案 1 :(得分:3)

动态调度(即使用虚拟功能)比直接调用更昂贵。

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

答案 2 :(得分:2)

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

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

如果您正在谈论使用dynamic_cast,那么根据我的理解(这不是基于具体的性能数字),您将获得非常显着的性能影响。

如果你正在谈论使用接口,那么我觉得通过更好的软件设计远远超过了进行vtable查找和额外调用的轻微打击。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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