【问题标题】:Should I use PIMPL everywhere? [closed]我应该到处使用 PIMPL 吗? [关闭]
【发布时间】:2015-02-13 10:45:37
【问题描述】:

我目前的项目涉及编写 C++ API,我决定使用 PIMPL 成语。

我是否应该在我的项目中到处使用 PIMPL 成语,例如我需要创建一个继承自 std::exception 的自定义类,我应该在设计这个类时考虑 PIMPL 成语还是我可以将其编写为公共实现?

仅仅因为我使用 PIMPL 习语就认为我创建的每个类都应该围绕它设计,这感觉是错误的。是否存在应该使用 PIMPL 的例外情况?

【问题讨论】:

  • 我希望它不应该在任何地方使用,因为那是我使用它的地方。
  • 我认为 PIMPL 的主要动机是通过在每次类的接口更改时不强制重新编译实现来减少编译时间 - 如果这不是问题,则无需在任何地方使用它跨度>

标签: c++ idioms pimpl-idiom


【解决方案1】:

如果您正在编写 API/库,那么问题是您的 API 用户的主要优势是什么,甚至他们将使用哪些 IDE 和工具来处理您的 API。 使用 PIMPL 的要点是:

  • 您希望真正对用户隐藏实现(您拥有大量私有方法和字段以及非常简单的公共接口)。
  • 您希望将它们从依赖于平台的代码中抽象出来。
  • 您想减少他们的构建时间。

当虚拟调用或任何类型的间接调用使您的用户在其程序的运行时间上花费过多时,您不应该使用 PIMPL:

  • 重复的小函数调用序列(您无法将其从 API 级别移除)。
  • 创建和删除大量小对象(您无法将其从 API 级别移除)。

【讨论】:

    【解决方案2】:

    PIMPL 有成本。

    因此,只有在你真正需要它的地方才是一个好主意,例如。包含使用 C++ 关键字作为名称的 C 标头,或者例如定义了无数个宏。

    一些(包括 Herb)提倡或至少不反对纯粹为了缩短构建时间而使用 PIMPL,但其他措施(例如将硬件投入问题)可能会降低成本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      相关资源
      最近更新 更多