PIMPL
它将类的实现细节与接口完全分离。
主要作用就是只给别人接口,告诉你怎么用的,但是不告诉你我类包含什么;
// 优点:
// - 减少编译时间(不需要包含成员的类型头文件等)
// - 更好的封装
// - ABI稳定性
PIMPL 把真正的数据成员放到一个不公开的实现类 (
Impl*)中,头文件里只放一个前置声明的指针。指针的大小永远不变(8字节),所以:
类的 ABI 稳定:即使
Impl内部加了再多成员,Impl*本身的大小和偏移不变。客户端无需重新编译,只要重新链接或直接替换动态库即可
// 缺点:
// - 额外的堆分配(性能开销)
// - 间接访问(可能影响缓存局部性)
// - 代码复杂性增加
cpp
// 传统类 - 实现暴露在头文件中
class Widget {
public:
Widget();
void doSomething();
private:
int data;
std::string name;
std::vector<double> values; // 用户能看到所有私有成员
};
// PIMPL版本 - 实现完全隐藏
class Widget {
public:
Widget();
~Widget();
void doSomething();
private:
class Impl; // 前向声明
std::unique_ptr<Impl> pImpl; // 指向隐藏的实现
};
// widget.cpp
class Widget::Impl {
int data;
std::string name;
std::vector<double> values; // 实现细节仅在.cpp文件中可见
void doSomethingImpl() {
// 实际实现
}
};
工厂模式:
后期补充
单列模式:
后期补充