我应该到处使用PIMPL吗?

时间:2014-12-15 10:47:52

标签: c++ idioms pimpl-idiom

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

我是否应该在项目中的任何地方使用PIMPL惯用语,例如我需要创建一个继承自std::exception的自定义类,我是否应该考虑使用PIMPL习惯用法来设计这个类,或者我可以像公开一样编写执行?

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

2 个答案:

答案 0 :(得分:3)

PIMPL有成本。

因此,在您真正需要它的地方,这是一个好主意,例如包含使用C ++关键字作为名称的C头,或者例如定义了数以万计的宏。

有些人(包括Herb)主张或者至少不反对纯粹使用PIMPL来减少构建时间,但其他措施(如在问题上投入硬件)可能成本更低。

答案 1 :(得分:3)

如果您正在编写API /库,问题是API用户的主要优势是什么,甚至是他们使用API​​时使用的IDE和工具。 使用PIMPL的关键点是:

  • 您希望真正隐藏用户的实现(您拥有大量私有方法和字段以及非常简单的公共界面)。
  • 您希望从与平台相关的代码中抽象它们。
  • 您希望缩短构建时间。

当虚拟调用或任何间接方式在用户的程序运行时间过长时,您不应该使用PIMPL:

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