当前位置: 首页 > news >正文

C++ 编程指南36 - 使用Pimpl模式实现稳定的ABI接口

一:概述

        C++ 的类布局(尤其是私有成员变量)直接影响它的 ABI(应用二进制接口)。如果你在类中添加或修改了私有成员,即使接口不变,编译器生成的二进制布局也会变,从而导致 ABI 不兼容。这意味着使用这个类的代码需要重新编译,严重破坏了库的二进制兼容性。为避免这种情况,Pimpl(Pointer to Implementation) 模式应运而生。

二:Pimpl 模式介绍

        Pimpl将类的实际实现细节封装在另一个类中(impl),对外只暴露一个指向实现的智能指针(如 std::unique_ptr<impl>)。这样你可以随意修改实现类而不会影响主类的 ABI,因为指针大小在所有平台都是固定的。

三:代码示例

        widget.h 为对外公开的接口文件:

class widget {
    class impl; // 前向声明实现类
    std::unique_ptr<impl> pimpl; // 指向实现的指针

public:
    void draw();       // 接口函数,转发到实现
    widget(int);       // 构造函数:传参数给实现
    ~widget();         // 析构函数:释放实现
    widget(widget&&) noexcept;
    widget(const widget&) = delete;
    widget& operator=(widget&&) noexcept;
    widget& operator=(const widget&) = delete;
};

        widget.cpp 为实现细节,隐藏在此文件中:

class widget::impl {
    int n;  // 实际的成员变量
public:
    void draw(const widget& w) { /* ... */ }
    impl(int n) : n(n) {}
};

        用户视角:

widget w(42);   // 实际构造 impl(42)
w.draw();       // 实际转发给 impl->draw()

 四:总结

       我们可以把这个规则理解为:将实现藏进“黑匣子”,只留遥控器给别人用。

http://www.dtcms.com/a/130108.html

相关文章:

  • 链接世界:计算机网络的核心与前沿
  • 使用SSH解决在IDEA中Push出现403的问题
  • 基于电子等排体的3D分子生成模型 ShEPhERD - 评测
  • 从代码学习深度学习 - 多头注意力 PyTorch 版
  • 【2025软考高级架构师】——项目管理(3)
  • 【毕设】Python构建基于TMDB电影推荐系统
  • L2范数与权重衰退
  • 烟花爆竹储存作业安全要求
  • nodejs构建项目
  • 前端开发中的问题排查与定位:HTML、CSS、JavaScript(报错的解决方式)
  • 高效的内容搜索工具推荐
  • 【工程开发】LLMC准确高效的LLM压缩工具(一)
  • MIPI协议介绍
  • (四十七)Dart 中的 `identical` 函数与 `const` 关键字
  • GM DC Monitor v2.0 数据中心监控预警平台-CMDB使用教程(第十篇)
  • 【图像处理基石】什么是通透感?
  • cropperjs 2.0裁剪图片后转base64提示“Tainted canvases may not be exported”跨域问题的解决办法。
  • 0x03.Redis 通常应用于哪些场景?
  • 【从0到1搞懂大模型】transformer先导:seq2seq、注意力机制、残差网络等(6)
  • C++ 数据结构之图:从理论到实践
  • React(1)基础入门
  • 【模拟电路】PIN光电二极管和APD雪崩光电二极管
  • I/O进程5
  • fio的资料
  • 基于FPGA的一维时间序列idct变换verilog实现,包含testbench和matlab辅助验证程序
  • L1 第6次课 for循环
  • Python学生信息查询
  • Lesson 11 One good turn deserves another
  • AtCoder Beginner Contest 401 E题 题解
  • 文件包含靶场