0.目录
- 简介
- 实现
- 优劣
- 引用
1.简介
PIMPL(Private Implementation 或 Pointer to Implementation),是C++ 在构建导出库接口时特有的技术手段。 将类Class中所有私有变量以及私有方法,封装在一单独的实现类ClassImpl中。在Class中通过一指向ClassImpl的私有指针,访问这些私有数据。ClassImpl类的具体定义和实现放入cpp中。“编译防火墙”的作用。
2.实现
class widget
{
// 公开成员
private:
struct impl; // 实现类的前置声明
// 一种实现示例:见下文中的其他设计选项和权衡
std::experimental::propagate_const< // 转发 const 的指针包装器
std::unique_ptr< // 唯一所有权的不透明指针
impl>> pImpl; // 指向前置声明的实现类
};
// widget.cpp(实现)
struct widget::impl
{
// 实现细节
};
3.优劣
优点:
- 使得程序接口有着稳定的ABI(应用程序二进制接口),即不会打破二进制兼容。
- 降低了程序编译依赖,从而缩短编译时间。
- 数据隐藏,使得头文件很干净,不包含实现细节,可以直接作为 API 参考。
- 降低模块的耦合
- 接口与实现分离,提高接口的稳定性
缺点:
- 实现者需要做更多工作。
- 由于子类需要访问,此机制对protected方法不奏效。
- 由于数据的隐藏,多少造成了代码可读性下降。
- 运行时性能被轻微的连累,尤其调用的函数为虚函数时。