【问题标题】:C++ Pimpl vs Pure Virtual Interface PerformanceC++ Pimpl 与纯虚拟接口性能
【发布时间】:2012-05-09 19:22:36
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 使用pimpl时,公共接口的方法可以内联,所以性能差异几乎没有。
  • 系统任务的成本会很高,因此函数调用本身的成本将是不可估量的(除非你能证明它不是)。因此,您不应将此作为您的决策标准。选择一种使编写代码最容易和最简单的方法。

标签: c++ performance cross-platform virtual-functions pimpl-idiom


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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


    总之,就是说,对于一个典型的虚函数实现,函数调用包括读取对象找到虚函数表指针,然后读取虚函数表找到函数指针,最后调用函数指针。

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


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

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

    【讨论】:

      猜你喜欢
      • 2010-10-23
      • 2012-08-08
      • 1970-01-01
      • 2017-07-17
      • 2019-06-06
      • 2014-09-04
      • 1970-01-01
      • 2012-10-11
      相关资源
      最近更新 更多