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

C++ 惯用法之 PIMPL

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

一、背景

1.概述

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

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

2.二进制兼容性

(1) 概述

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

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

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

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

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

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

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

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

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

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

(3) pimpl 下类的内存布局

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

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

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

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

二、pimpl 应用

1.功能实现细节隐藏

(1) 概述

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

(2) 隐藏实现细节

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

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

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

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

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

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

class A;class demoClass{  A a;};

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

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

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

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

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

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

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

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

(2) 代码示例

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

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

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

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

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • 中兴AX5400Pro+上手体验:再升级 双2.5G网口+USB 3.0这次全都有

    2021年11月的时候,中兴先后发布了两款路由器产品,中兴AX5400和中兴AX5400 Pro,从产品命名上就不难看出这是隶属于同一系列的,但在外观设计上这两款产品可以说是完全没一点关系
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 量化指标是与非:挽救被量化指标扼杀的技术团队

    作者 | 刘新翠整理 | 徐杰承本文整理自快狗打车技术总监刘新翠在WOT2023大会上的主题分享,更多精彩内容及现场PPT,请关注51CTO技术栈公众号,发消息【WOT2023PPT】即可直接领取
  • 三言两语说透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用
  • 三分钟白话RocketMQ系列—— 如何发送消息

    我们知道RocketMQ主要分为消息 生产、存储(消息堆积)、消费 三大块领域。那接下来,我们白话一下,RocketMQ是如何发送消息的,揭秘消息生产全过程。注意,如果白话中不小心提到相关代
  • 为什么你不应该使用Div作为可点击元素

    按钮是为任何网络应用程序提供交互性的最常见方式。但我们经常倾向于使用其他HTML元素,如 div span 等作为 clickable 元素。但通过这样做,我们错过了许多内置浏览器的功能。
  • 网红炒股不为了赚钱,那就是耍流氓!

    来源:首席商业评论6月26日高调宣布入市,网络名嘴大v胡锡进居然进军了股市。在一次财经媒体峰会上,几个财经圈媒体大佬就&ldquo;胡锡进炒股是否知道认真报道&rdquo;展开讨论。有
  • 半导体需求下滑 三星电子DS业务部门今年营业亏损预计超10万亿韩元

    7月17日消息,据外媒报道,去年下半年开始的半导体需求下滑,影响到了三星电子、SK海力士、英特尔等诸多厂商,营收明显下滑,部分厂商甚至出现了亏损。作为
  • 首发天玑9200+ iQOO Neo8系列发布首销售价2299元起

    2023年5月23日晚,iQOO Neo8系列正式发布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro强悍登场,限时售价3099元起;价位段最强性能手机iQOO Neo8同期上市
Top