【发布时间】:2011-02-12 10:29:02
【问题描述】:
可能重复:
What is the performance cost of having a virtual method in a C++ class?
接口会减慢程序速度是真的吗?我听说是这种情况,因为在运行期间,每次使用实现此接口的对象时,都必须决定实现该对象属于哪个类。
我对 C++ 的答案特别感兴趣,但总的来说也是如此。如果这是真的,那么一些数字也会有所帮助。
非常感谢!
【问题讨论】:
可能重复:
What is the performance cost of having a virtual method in a C++ class?
接口会减慢程序速度是真的吗?我听说是这种情况,因为在运行期间,每次使用实现此接口的对象时,都必须决定实现该对象属于哪个类。
我对 C++ 的答案特别感兴趣,但总的来说也是如此。如果这是真的,那么一些数字也会有所帮助。
非常感谢!
【问题讨论】:
是的,但如果您需要接口所需的灵活性,这并不重要,当然也不够重要。 (请记住,如果您大量使用接口,则 vtable 的相关位最终会出现在 L1 或 L2 缓存中,因此不会像您担心的那样多。)
【讨论】:
动态调度(即使用虚函数)比直接调用更昂贵。
但它必须是一个不寻常的程序才能成为性能限制器。更有可能限制性能的是磁盘/网络访问、更新 UI 或内存带宽等。
【讨论】:
如果您使用接口模式(即 C++ 中的抽象类),那么是的,虚拟函数调用会产生开销。但是,如果您实现自己的非抽象类机制来实现相同的目标,那么您也会有开销,可能比 VF 调用更大。所以实际上,没有额外的开销。
【讨论】:
您可能正在谈论 C++ 中的虚拟继承。如果虚拟类未在关键代码路径中使用,则性能损失很小。基本上开销与附加函数调用相同。
【讨论】:
虽然比利指出这很像other post on SO,但我认为并不完全相同...主要是因为这个问题的措辞方式。
因为 Olga 谈到了一个“决定”,我几乎认为她在使用接口与使用派生类以及通过 dynamic_cast 确定指向对象的指针是否属于特定类之间混淆了。
如果您正在谈论使用 dynamic_cast,那么据我所知(这不是基于具体的性能数字),您将获得相当显着的性能影响。
如果您是在谈论使用接口,那么我觉得进行 vtable 查找和额外调用的轻微影响远远超过更好的软件设计。
【讨论】: