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

C++ 惯用法之 PIMPL

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

一、背景

1.概述

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

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

2.二进制兼容性

(1) 概述

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

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

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

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

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

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

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

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

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

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

(3) pimpl 下类的内存布局

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

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

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

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

二、pimpl 应用

1.功能实现细节隐藏

(1) 概述

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

(2) 隐藏实现细节

通过 pimp 方法设计类可以实现隐藏类的私有成员和方法的目的,仅对外暴露公有的接口。Q9h28资讯网——每日最新资讯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) 概述

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

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

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

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

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

class A;class demoClass{  A a;};

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

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

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

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

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

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

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

使用 pimpl 方法改进则可以减少编译依赖,仅在类的实现文件中包含头文件即可:Q9h28资讯网——每日最新资讯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 的方式把类的功能实现用另外一个独立的类来完成,可以在需要的时候动态的配置类的实现方法,而保持类的接口不变。Q9h28资讯网——每日最新资讯28at.com

(2) 代码示例

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

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

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

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

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • Mate60手机壳曝光 致敬自己的经典设计

    8月3日消息,今天下午博主数码闲聊站带来了华为Mate60的第三方手机壳图,可以让我们在真机发布之前看看这款华为全新旗舰的大致轮廓。从曝光的图片看,Mate 60背后摄像头面积依然
  • Redmi Pad评测:红米充满野心的一次尝试

    从Note系列到K系列,从蓝牙耳机到笔记本电脑,红米不知不觉之间也已经形成了自己颇有竞争力的产品体系,在中端和次旗舰市场上甚至要比小米新机的表现来得更好,正所谓“大丈夫生居
  • 石头智能洗地机A10 Plus体验:双向自清洁治好了我的懒癌

    一、前言和介绍专为家庭请假懒人而生的石头科技在近日又带来了自己的全新旗舰新品,石头智能洗地机A10 Plus。从这个产品名上就不难看出,这次石头推出的并不是常见的扫地机器
  • 跑分安卓第一!Redmi K60至尊版8月发布!卢伟冰:目标年度性能之王

    8月5日消息,Redmi K60至尊版将于8月发布,在此前举行的战略发布会上,官方该机将搭载搭载天玑9200+处理器,安兔兔V10跑分超177万分,是目前安卓阵营最高的分数
  • 让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 在线图片编辑器,支持PSD解析、AI抠图等

    自从我上次分享一个人开发仿造稿定设计的图片编辑器到现在,不知不觉已过去一年时间了,期间我经历了裁员失业、面试找工作碰壁,寒冬下一直没有很好地履行计划.....这些就放在日
  • 首发天玑9200+ iQOO Neo8系列发布首销售价2299元起

    2023年5月23日晚,iQOO Neo8系列正式发布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro强悍登场,限时售价3099元起;价位段最强性能手机iQOO Neo8同期上市
  • SN570 NVMe SSD固态硬盘 价格与性能兼具

    SN570 NVMe SSD固态硬盘是西部数据发布的最新一代WD Blue系列的固态硬盘,不仅闪存技术更为精进,性能也得到了进一步的跃升。WD Blue SN570 NVMe SSD的包装外
Top