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

當前位置:首頁 > 科技  > 軟件

C++ 慣用法之 PIMPL

來源: 責編: 時間:2024-02-01 12:47:26 203觀看
導讀一、背景1.概述PIMPL 是 C++ 中的一個編程技巧,意思為指向實現的指針。具體操作是把類的實現細節放到一個單獨的類中,并用一個指針進行訪問。2.二進制兼容性(1) 概述二進制兼容是指當庫文件升級后所有使用該庫的應用程

一、背景

1.概述

PIMPL 是 C++ 中的一個編程技巧,意思為指向實現的指針。具體操作是把類的實現細節放到一個單獨的類中,并用一個指針進行訪問。tYG28資訊網——每日最新資訊28at.com

tYG28資訊網——每日最新資訊28at.com

2.二進制兼容性

(1) 概述

二進制兼容是指當庫文件升級后所有使用該庫的應用程序不必重新編譯,其本質就是類的內存布局不變。使用 pimpl 方法設計類可以實現二進制兼容的目的。tYG28資訊網——每日最新資訊28at.com

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

原始類定義:tYG28資訊網——每日最新資訊28at.com

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

內存布局如下:tYG28資訊網——每日最新資訊28at.com

tYG28資訊網——每日最新資訊28at.com

類更改后的定義:tYG28資訊網——每日最新資訊28at.com

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

內存布局如下:tYG28資訊網——每日最新資訊28at.com

tYG28資訊網——每日最新資訊28at.com

(3) pimpl 下類的內存布局

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

內存布局如下:tYG28資訊網——每日最新資訊28at.com

tYG28資訊網——每日最新資訊28at.com

如上圖所示,無論類的實現類的數據成員如何變化,類的布局始終不變。tYG28資訊網——每日最新資訊28at.com

二、pimpl 應用

1.功能實現細節隱藏

(1) 概述

作為接口的提供者,我們希望接口的使用者不必知道接口實現的更多細節,因為根據類的私有數據成員和方法一般就可以猜測出接口的設計方式。tYG28資訊網——每日最新資訊28at.com

(2) 隱藏實現細節

通過 pimp 方法設計類可以實現隱藏類的私有成員和方法的目的,僅對外暴露公有的接口。tYG28資訊網——每日最新資訊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) 概述

在一個常用的頭文件中如果包含了太多其他不必要的頭文件會嚴重降低編譯效率。tYG28資訊網——每日最新資訊28at.com

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

值類型的成員因為要分配內存大小必須知道其確定的定義,需要包含其頭文件tYG28資訊網——每日最新資訊28at.com

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

如果僅有類的申明則會出錯:tYG28資訊網——每日最新資訊28at.com

class A;class demoClass{  A a;};

tYG28資訊網——每日最新資訊28at.com

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

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

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

一般庫文件使用者僅需要包含當前庫對應的頭文件即可,不應該再包含其他的頭文件。假設庫的頭文件定義如下:tYG28資訊網——每日最新資訊28at.com

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

此時,若 A 為另外一個公共庫,則庫的使用者需要在項目中配置 A.h 的路徑;若 A 為自定義類,則庫的提供者還需要額外提供 A.h 文件。tYG28資訊網——每日最新資訊28at.com

使用 pimpl 方法改進則可以減少編譯依賴,僅在類的實現文件中包含頭文件即可:tYG28資訊網——每日最新資訊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 的方式把類的功能實現用另外一個獨立的類來完成,可以在需要的時候動態的配置類的實現方法,而保持類的接口不變。tYG28資訊網——每日最新資訊28at.com

(2) 代碼示例

公共接口類:tYG28資訊網——每日最新資訊28at.com

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

功能實現抽象類:tYG28資訊網——每日最新資訊28at.com

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

功能實現派生類:tYG28資訊網——每日最新資訊28at.com

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

功能實現方式的動態配置:tYG28資訊網——每日最新資訊28at.com

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

tYG28資訊網——每日最新資訊28at.com

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

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 十個React狀態管理庫推薦:打造高效、可維護的前端應用

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

標簽:
  • 熱門焦點
  • K60 Pro官方停產 第三方瞬間漲價

    雖然沒有官方宣布,但Redmi的一些高管也已經透露了,Redmi K60 Pro已經停產且不會補貨,這一切都是為了即將到來的K60 Ultra鋪路,屬于廠家的正常操作。但有意思的是該機在停產之后
  • 官方承諾:K60至尊版將會首批升級MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版將會搭載天璣9200+處理器和獨顯芯片X7的同時,Redmi給出了官方承諾,K60至尊重大更新首批升級,會首批推送MIUI 15。也就是說雖然
  • 6月iOS設備性能榜:M2穩居榜首 A系列只能等一手3nm來救

    沒有新品發布,自然iOS設備性能榜的上榜設備就沒有什么更替,僅僅只有跑分變化而產生的排名變動,畢竟蘋果新品的發布節奏就是這樣的,一年下來也就幾個移動端新品,不會像安卓廠商,一
  • 《英雄聯盟》夏季賽總決賽今日開打!JDG對陣LNG首發名單來了 Knight:準備三連冠

    8月5日消息,今日17:00,《英雄聯盟》2023LPL夏季賽總決賽將正式開打,由JDG對陣LNG。對兩支隊伍來說,這場比賽不僅要爭奪夏季賽冠軍,更要決定誰才是LPL賽區一
  • 三言兩語說透設計模式的藝術-單例模式

    寫在前面單例模式是一種常用的軟件設計模式,它所創建的對象只有一個實例,且該實例易于被外界訪問。單例對象由于只有一個實例,所以它可以方便地被系統中的其他對象共享,從而減少
  • 阿里大調整

    來源:產品劉有媒體報道稱,近期淘寶天貓集團啟動了近年來最大的人力制度改革,涉及員工績效、層級體系等多個核心事項,目前已形成一個初步的&ldquo;征求意見版&rdquo;:1、取消P序列
  • 阿里瓴羊One推出背后,零售企業迎數字化新解

    作者:劉曠近年來隨著數字經濟的高速發展,各式各樣的SaaS應用服務更是層出不窮,但本質上SaaS大多局限于單一業務流層面,對用戶核心關切的增長問題等則沒有提供更好的解法。在Saa
  • 華為HarmonyOS 4.0將于8月4日發布 或搭載AI大模型技術

    華為宣布HarmonyOS4.0將于8月4日正式發布。此前,華為已經針對開發者公布了HarmonyOS4.0,以便于開發者提前進行適配,也因此被曝光出了一些新系統的特性
  • OPPO K11搭載長壽版100W超級閃充:26分鐘充滿100%

    據此前官方宣布,OPPO將于7月25日也就是今天下午14:30舉辦新品發布會,屆時全新的OPPO K11將正式與大家見面,將主打旗艦影像,和同檔位競品相比,其最大的賣
Top 主站蜘蛛池模板: 凤台县| 香港 | 兴海县| 安陆市| 长汀县| 崇义县| 天峻县| 紫金县| 南乐县| 烟台市| 承德县| 绵阳市| 和龙市| 罗平县| 连州市| 定日县| 南康市| 霍城县| 蓬莱市| 招远市| 汉川市| 枣阳市| 攀枝花市| 广昌县| 余干县| 南昌市| 临邑县| 陆河县| 淳化县| 石屏县| 四川省| 博湖县| 沙湾县| 兴文县| 镇江市| 龙江县| 新营市| 咸宁市| 巴青县| 资兴市| 陇川县|