日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

C++ 慣用法之 PIMPL

來源: 責(zé)編: 時(shí)間:2024-02-01 12:47:26 202觀看
導(dǎo)讀一、背景1.概述PIMPL 是 C++ 中的一個(gè)編程技巧,意思為指向?qū)崿F(xiàn)的指針。具體操作是把類的實(shí)現(xiàn)細(xì)節(jié)放到一個(gè)單獨(dú)的類中,并用一個(gè)指針進(jìn)行訪問。2.二進(jìn)制兼容性(1) 概述二進(jìn)制兼容是指當(dāng)庫文件升級(jí)后所有使用該庫的應(yīng)用程

一、背景

1.概述

PIMPL 是 C++ 中的一個(gè)編程技巧,意思為指向?qū)崿F(xiàn)的指針。具體操作是把類的實(shí)現(xiàn)細(xì)節(jié)放到一個(gè)單獨(dú)的類中,并用一個(gè)指針進(jìn)行訪問。0Wb28資訊網(wǎng)——每日最新資訊28at.com

0Wb28資訊網(wǎng)——每日最新資訊28at.com

2.二進(jìn)制兼容性

(1) 概述

二進(jìn)制兼容是指當(dāng)庫文件升級(jí)后所有使用該庫的應(yīng)用程序不必重新編譯,其本質(zhì)就是類的內(nèi)存布局不變。使用 pimpl 方法設(shè)計(jì)類可以實(shí)現(xiàn)二進(jìn)制兼容的目的。0Wb28資訊網(wǎng)——每日最新資訊28at.com

(2) 類成員更改后的內(nèi)存布局

原始類定義:0Wb28資訊網(wǎng)——每日最新資訊28at.com

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

內(nèi)存布局如下:0Wb28資訊網(wǎng)——每日最新資訊28at.com

0Wb28資訊網(wǎng)——每日最新資訊28at.com

類更改后的定義:0Wb28資訊網(wǎng)——每日最新資訊28at.com

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

內(nèi)存布局如下:0Wb28資訊網(wǎng)——每日最新資訊28at.com

0Wb28資訊網(wǎng)——每日最新資訊28at.com

(3) pimpl 下類的內(nèi)存布局

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

內(nèi)存布局如下:0Wb28資訊網(wǎng)——每日最新資訊28at.com

0Wb28資訊網(wǎng)——每日最新資訊28at.com

如上圖所示,無論類的實(shí)現(xiàn)類的數(shù)據(jù)成員如何變化,類的布局始終不變。0Wb28資訊網(wǎng)——每日最新資訊28at.com

二、pimpl 應(yīng)用

1.功能實(shí)現(xiàn)細(xì)節(jié)隱藏

(1) 概述

作為接口的提供者,我們希望接口的使用者不必知道接口實(shí)現(xiàn)的更多細(xì)節(jié),因?yàn)楦鶕?jù)類的私有數(shù)據(jù)成員和方法一般就可以猜測(cè)出接口的設(shè)計(jì)方式。0Wb28資訊網(wǎng)——每日最新資訊28at.com

(2) 隱藏實(shí)現(xiàn)細(xì)節(jié)

通過 pimp 方法設(shè)計(jì)類可以實(shí)現(xiàn)隱藏類的私有成員和方法的目的,僅對(duì)外暴露公有的接口。0Wb28資訊網(wǎng)——每日最新資訊28at.com

class demoClass{public:  void func();//對(duì)外接口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) 概述

在一個(gè)常用的頭文件中如果包含了太多其他不必要的頭文件會(huì)嚴(yán)重降低編譯效率。0Wb28資訊網(wǎng)——每日最新資訊28at.com

(2) 值類型的成員必須引用其頭文件

值類型的成員因?yàn)橐峙鋬?nèi)存大小必須知道其確定的定義,需要包含其頭文件0Wb28資訊網(wǎng)——每日最新資訊28at.com

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

如果僅有類的申明則會(huì)出錯(cuò):0Wb28資訊網(wǎng)——每日最新資訊28at.com

class A;class demoClass{  A a;};

0Wb28資訊網(wǎng)——每日最新資訊28at.com

(3) 指針或者引用類型,僅需要類的申明

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

(4) 使用 pimpl 降低編譯依賴

一般庫文件使用者僅需要包含當(dāng)前庫對(duì)應(yīng)的頭文件即可,不應(yīng)該再包含其他的頭文件。假設(shè)庫的頭文件定義如下:0Wb28資訊網(wǎng)——每日最新資訊28at.com

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

此時(shí),若 A 為另外一個(gè)公共庫,則庫的使用者需要在項(xiàng)目中配置 A.h 的路徑;若 A 為自定義類,則庫的提供者還需要額外提供 A.h 文件。0Wb28資訊網(wǎng)——每日最新資訊28at.com

使用 pimpl 方法改進(jìn)則可以減少編譯依賴,僅在類的實(shí)現(xiàn)文件中包含頭文件即可:0Wb28資訊網(wǎng)——每日最新資訊28at.com

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

2.動(dòng)態(tài)配置功能的實(shí)現(xiàn)方法

(1) 概述

使用 pimpl 的方式把類的功能實(shí)現(xiàn)用另外一個(gè)獨(dú)立的類來完成,可以在需要的時(shí)候動(dòng)態(tài)的配置類的實(shí)現(xiàn)方法,而保持類的接口不變。0Wb28資訊網(wǎng)——每日最新資訊28at.com

(2) 代碼示例

公共接口類:0Wb28資訊網(wǎng)——每日最新資訊28at.com

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

功能實(shí)現(xiàn)抽象類:0Wb28資訊網(wǎng)——每日最新資訊28at.com

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

功能實(shí)現(xiàn)派生類:0Wb28資訊網(wǎng)——每日最新資訊28at.com

class demoClassImpl1 : public demoClassImpl{public:    void func() { cout << "實(shí)現(xiàn)方式1" << endl; }};class demoClassImpl2 : public demoClassImpl{public:    void func() { cout << "實(shí)現(xiàn)方式2" << endl; }};

功能實(shí)現(xiàn)方式的動(dòng)態(tài)配置:0Wb28資訊網(wǎng)——每日最新資訊28at.com

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

0Wb28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-70407-0.htmlC++ 慣用法之 PIMPL

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 十個(gè)React狀態(tài)管理庫推薦:打造高效、可維護(hù)的前端應(yīng)用

下一篇: 探秘C++的移動(dòng)語義:釋放力量,提升性能

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 仁怀市| 化德县| 彭阳县| 芒康县| 盐城市| 海盐县| 镇宁| 贵阳市| 浦江县| 太谷县| 邢台市| 丽江市| 涟水县| 忻城县| 西乌珠穆沁旗| 焉耆| 舟山市| 芦山县| 泉州市| 洛扎县| 思南县| 汉中市| 疏勒县| 土默特左旗| 昌邑市| 贵阳市| 柞水县| 永州市| 潮州市| 屏山县| 通江县| 上虞市| 莲花县| 林西县| 宣化县| 仲巴县| 临汾市| 亚东县| 静海县| 上蔡县| 宝应县|