C++ pimpl 与纯虚拟接口性能

C++ Pimpl vs Pure Virtual Interface Performance

本文关键字:接口 性能 虚拟 pimpl C++      更新时间:2023-10-16

我知道有很多关于这个主题的帖子,但我很难找到这个确切问题的答案。

对于函数调用,纯虚拟接口和 pimpl 哪个更快?

乍一看,在我看来,纯虚拟接口会更快,因为使用 pimpl 将花费两个函数调用而不是一个......或者在这种情况下,某种聪明的编译器技巧会接管吗?

编辑:我正在尝试决定应该使用其中的哪一个来抽象出一些对象的系统依赖部分,这些对象最终可能不得不非常频繁地大量生成。

编辑:
我想在这一点上值得一提的是,我问题的根源是我误认为抽象工厂设计模式是一种使我的代码在多个平台上工作的方法,而它的真正目的是在运行时切换给定接口的实现。

这两个选项并不等同,由于重点不同,因此不应在性能上进行比较。即使它们是等效的,在大多数情况下,性能差异也是很小的或不重要的。如果您在极少数情况下知道调度是一个问题,那么您就有工具可以自己衡量差异。

你为什么这么问?这个问题似乎没有意义。

当人们想要多态性时,人们通常使用虚函数:当你希望在派生类中覆盖它们时。

当想要从头文件中删除实现细节时,通常使用 pimpl。

这两者真的不能互换。在我的头顶上,我想不出任何合理的情况,你会使用一个并考虑用另一个替换它。


无论如何,也就是说,对于虚函数的典型实现,函数调用涉及读取对象以查找虚函数表指针,

然后读取虚函数表以查找函数指针,最后调用函数指针。

对于通过 pimpl 实现的类,一个函数调用是强制的,但它绝对可以是"幕后"的任何内容。不管你有什么建议,范式都没有暗示第二个函数调用。


最后,不要忘记通常的优化准则:您必须实际实施和衡量。试图"思考"答案往往会导致糟糕的结果,即使是在这种事情上有经验的人。

当然,最重要的优化规则是:在花费大量时间尝试优化之前,确保某些事情很重要。否则,您最终会浪费大量时间和精力。