当前位置:首页 > 科技  > 软件

C++ 惯用法之 PIMPL

来源: 责编: 时间:2024-02-01 12:47:26 298观看
导读一、背景1.概述PIMPL 是 C++ 中的一个编程技巧,意思为指向实现的指针。具体操作是把类的实现细节放到一个单独的类中,并用一个指针进行访问。2.二进制兼容性(1) 概述二进制兼容是指当库文件升级后所有使用该库的应用程

一、背景

1.概述

PIMPL 是 C++ 中的一个编程技巧,意思为指向实现的指针。具体操作是把类的实现细节放到一个单独的类中,并用一个指针进行访问。BpE28资讯网——每日最新资讯28at.com

BpE28资讯网——每日最新资讯28at.com

2.二进制兼容性

(1) 概述

二进制兼容是指当库文件升级后所有使用该库的应用程序不必重新编译,其本质就是类的内存布局不变。使用 pimpl 方法设计类可以实现二进制兼容的目的。BpE28资讯网——每日最新资讯28at.com

(2) 类成员更改后的内存布局

原始类定义:BpE28资讯网——每日最新资讯28at.com

class demoClass{private:  int a;  int b;};

内存布局如下:BpE28资讯网——每日最新资讯28at.com

BpE28资讯网——每日最新资讯28at.com

类更改后的定义:BpE28资讯网——每日最新资讯28at.com

class demoClass{private:  char c;  int a;  int b;};

内存布局如下:BpE28资讯网——每日最新资讯28at.com

BpE28资讯网——每日最新资讯28at.com

(3) pimpl 下类的内存布局

class demoClass{private:  class demoClassImpl;  demoClassImpl* impl;};class demoClass::demoClassImpl{public:  int a;  int b;};

内存布局如下:BpE28资讯网——每日最新资讯28at.com

BpE28资讯网——每日最新资讯28at.com

如上图所示,无论类的实现类的数据成员如何变化,类的布局始终不变。BpE28资讯网——每日最新资讯28at.com

二、pimpl 应用

1.功能实现细节隐藏

(1) 概述

作为接口的提供者,我们希望接口的使用者不必知道接口实现的更多细节,因为根据类的私有数据成员和方法一般就可以猜测出接口的设计方式。BpE28资讯网——每日最新资讯28at.com

(2) 隐藏实现细节

通过 pimp 方法设计类可以实现隐藏类的私有成员和方法的目的,仅对外暴露公有的接口。BpE28资讯网——每日最新资讯28at.com

class demoClass{public:  void func();//对外接口private:  class demoClassImpl;  demoClassImpl* impl;};class demoClass::demoClassImpl{private:  int a;  int b;    void func1();  void func2();public:  void func();};void demoClass::func(){  impl->func();}

2.降低编译依赖

(1) 概述

在一个常用的头文件中如果包含了太多其他不必要的头文件会严重降低编译效率。BpE28资讯网——每日最新资讯28at.com

(2) 值类型的成员必须引用其头文件

值类型的成员因为要分配内存大小必须知道其确定的定义,需要包含其头文件BpE28资讯网——每日最新资讯28at.com

#include "A.h"class demoClass{  A a;};

如果仅有类的申明则会出错:BpE28资讯网——每日最新资讯28at.com

class A;class demoClass{  A a;};

BpE28资讯网——每日最新资讯28at.com

(3) 指针或者引用类型,仅需要类的申明

class A;class demoClass{  A  func(A a);};

(4) 使用 pimpl 降低编译依赖

一般库文件使用者仅需要包含当前库对应的头文件即可,不应该再包含其他的头文件。假设库的头文件定义如下:BpE28资讯网——每日最新资讯28at.com

#include "A.h"class demoClass{private:  A a;public:  void func();};

此时,若 A 为另外一个公共库,则库的使用者需要在项目中配置 A.h 的路径;若 A 为自定义类,则库的提供者还需要额外提供 A.h 文件。BpE28资讯网——每日最新资讯28at.com

使用 pimpl 方法改进则可以减少编译依赖,仅在类的实现文件中包含头文件即可:BpE28资讯网——每日最新资讯28at.com

// demoClass.hclass demoClass{public:  void func();//对外接口private:  class demoClassImpl;  demoClassImpl* impl;};// demoClass.cpp#include "A.h"class demoClass::demoClassImpl{private:  A a;public:  void func();};

2.动态配置功能的实现方法

(1) 概述

使用 pimpl 的方式把类的功能实现用另外一个独立的类来完成,可以在需要的时候动态的配置类的实现方法,而保持类的接口不变。BpE28资讯网——每日最新资讯28at.com

(2) 代码示例

公共接口类:BpE28资讯网——每日最新资讯28at.com

class demoClassImpl;class demoClass{public:    void func();//对外接口public:    demoClassImpl* impl;};void demoClass::func(){    impl->func();}

功能实现抽象类:BpE28资讯网——每日最新资讯28at.com

class demoClassImpl{public:    virtual void func() = 0;};

功能实现派生类:BpE28资讯网——每日最新资讯28at.com

class demoClassImpl1 : public demoClassImpl{public:    void func() { cout << "实现方式1" << endl; }};class demoClassImpl2 : public demoClassImpl{public:    void func() { cout << "实现方式2" << endl; }};

功能实现方式的动态配置:BpE28资讯网——每日最新资讯28at.com

demoClass* demo = new demoClass;demoClassImpl1* impl1 = new demoClassImpl1;demo->impl = impl1;demo->func();demoClassImpl2* impl2 = new demoClassImpl2;demo->impl = impl2;demo->func();

BpE28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-70407-0.htmlC++ 惯用法之 PIMPL

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 十个React状态管理库推荐:打造高效、可维护的前端应用

下一篇: 探秘C++的移动语义:释放力量,提升性能

标签:
  • 热门焦点
  • 5月安卓手机好评榜:魅族20 Pro夺冠

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年5月1日至5月31日,仅限国内市场。第一名:魅族20 Pro好评率:97.50%不得不感慨魅族老品牌还
  • 十个可以手动编写的 JavaScript 数组 API

    JavaScript 中有很多API,使用得当,会很方便,省力不少。 你知道它的原理吗? 今天这篇文章,我们将对它们进行一次小总结。现在开始吧。1.forEach()forEach()用于遍历数组接收一参
  • JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 深度探索 Elasticsearch 8.X:function_score 参数解读与实战案例分析

    在 Elasticsearch 中,function_score 可以让我们在查询的同时对搜索结果进行自定义评分。function_score 提供了一系列的参数和函数让我们可以根据需求灵活地进行设置。近期
  • JVM优化:实战OutOfMemoryError异常

    一、Java堆溢出堆内存中主要存放对象、数组等,只要不断地创建这些对象,并且保证 GC Roots 到对象之间有可达路径来避免垃 圾收集回收机制清除这些对象,当这些对象所占空间超过
  • 电视息屏休眠仍有网络上传 爱奇艺被质疑“薅消费者羊毛”

    记者丨宁晓敏 见习生丨汗青出品丨鳌头财经(theSankei) 前不久,爱奇艺发布了一份亮眼的一季报,不仅营收和会员营收创造历史最佳表现,其运营利润也连续6个月实现增长。自去年年初
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为&ldquo;纯欲天花板&rdquo;的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • OPPO K11搭载高性能石墨散热系统:旗舰同款 性能凉爽释放

    日前OPPO官方宣布,将于7月25日14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖点就是将配备索尼
Top