3

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

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

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

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

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

4

2 回答 2

5

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

于 2012-04-30T02:29:33.763 回答
1

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

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

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

两者确实不能互换。在我的脑海中,我想不出任何合理的情况,你会使用一个并考虑用另一个替换它。


无论如何,也就是说,对于典型的虚函数实现,函数调用包括读取对象以找到虚函数表指针,然后读取虚函数表以找到函数指针,最后调用函数指针。

对于通过 pimpl 实现的类,强制调用一个函数,但它绝对可以是“幕后”的任何东西。尽管您提出了建议,但范式并未暗示第二个函数调用。


最后,不要忘记通常的优化准则适用:您必须实际实施和衡量。试图“想”出答案往往会导致糟糕的结果,即使是在这类事情上有经验的人也是如此。

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

于 2012-04-30T02:38:48.050 回答