Pimpl惯用法(Pointer to Implementation)详解
什么是Pimpl惯用法?它的设计目的是什么?如何使用Pimpl隐藏实现细节(编译防火墙)?Pimpl的优缺点以及在现代C++中如何实现更好?
回答
编译有声
Pimpl(Pointer to Implementation):将类的私有成员封装到前向声明的实现类中,通过指针(通常是unique_ptr)间接访问。头文件只暴露公共接口和指针,私有实现细节完全隐藏。优点:①编译防火墙——修改实现不触发客户端重编译;②二进制兼容——添加成员不改变类大小;③接口与实现完全解耦。缺点:①间接访问增加运行时开销;②额外的动态分配;③异常安全要求(自定义析构需在源文件中完成)。现代C++实现:class Widget { public: Widget(); ~Widget(); private: struct Impl; unique_ptr<Impl> pImpl; };。析构函数和拷贝操作必须在实现文件中定义(因unique_ptr需要完整类型)。C++23的import std结合Pimpl更简洁。注意:移动语义天然高效(Pimpl类通常可移动)。