網(wǎng)站首頁 編程語言 正文
二進(jìn)制兼容性
①.概述
二進(jìn)制兼容是指當(dāng)庫文件升級后所有使用該庫的應(yīng)用程序不必重新編譯,其本質(zhì)就是類的內(nèi)存布局不變。使用 pimpl 方法設(shè)計(jì)類可以實(shí)現(xiàn)二進(jìn)制兼容的目的。
②.類成員更改后的內(nèi)存布局
原始類定義:
class demoClass
{
private:
int a;
int b;
};
類更改后的定義:
class demoClass
{
private:
char c;
int a;
int b;
};
②.pimpl 下類的內(nèi)存布局
class demoClass
{
private:
class demoClassImpl;
demoClassImpl* impl;
};
class demoClass::demoClassImpl
{
public:
int a;
int b;
};
如上圖所示,無論類的實(shí)現(xiàn)類的數(shù)據(jù)成員如何變化,類的布局始終不變。
功能實(shí)現(xiàn)細(xì)節(jié)隱藏
①.概述
作為接口的提供者,我們希望接口的使用者不必知道接口實(shí)現(xiàn)的更多細(xì)節(jié),因?yàn)楦鶕?jù)類的私有數(shù)據(jù)成員和方法一般就可以猜測出接口的設(shè)計(jì)方式。
②.隱藏實(shí)現(xiàn)細(xì)節(jié)
通過 pimp 方法設(shè)計(jì)類可以實(shí)現(xiàn)隱藏類的私有成員和方法的目的,僅對外暴露公有的接口。
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();
}
編譯依賴
①.概述
在一個常用的頭文件中如果包含了太多其他不必要的頭文件會嚴(yán)重降低編譯效率。
②.值類型的成員必須引用其頭文件
值類型的成員因?yàn)橐峙鋬?nèi)存大小必須知道其確定的定義,需要包含其頭文件
#include "A.h"
class demoClass
{
A a;
};
如果僅有類的申明則會出錯:
class A;
class demoClass
{
A a;
};
③.指針或者引用類型,僅需要類的申明
class A;
class demoClass
{
A *a;
};
④.函數(shù)的參數(shù)和返回值類型,僅需要類的申明
class A;
class demoClass
{
A func(A a);
};
⑤.使用 pimpl 降低編譯依賴
一般庫文件使用者僅需要包含當(dāng)前庫對應(yīng)的頭文件即可,不應(yīng)該再包含其他的頭文件。假設(shè)庫的頭文件定義如下:
#include "A.h"
class demoClass
{
private:
A a;
public:
void func();
};
此時(shí),若 A 為另外一個公共庫,則庫的使用者需要在項(xiàng)目中配置 A.h 的路徑;若 A 為自定義類,則庫的提供者還需要額外提供 A.h 文件。
使用 pimpl 方法改進(jìn)則可以減少編譯依賴,僅在類的實(shí)現(xiàn)文件中包含頭文件即可:
// demoClass.h
class demoClass
{
public:
void func();//對外接口
private:
class demoClassImpl;
demoClassImpl* impl;
};
// demoClass.cpp
#include "A.h"
class demoClass::demoClassImpl
{
private:
A a;
public:
void func();
};
動態(tài)配置功能的實(shí)現(xiàn)方法
①.概述
使用 pimpl 的方式把類的功能實(shí)現(xiàn)用另外一個獨(dú)立的類來完成,可以在需要的時(shí)候動態(tài)的配置類的實(shí)現(xiàn)方法,而保持類的接口不變。
②.代碼示例
公共接口類:
class demoClassImpl;
class demoClass
{
public:
void func();//對外接口
public:
demoClassImpl* impl;
};
void demoClass::func()
{
impl->func();
}
功能實(shí)現(xiàn)抽象類:
class demoClassImpl
{
public:
virtual void func() = 0;
};
功能實(shí)現(xiàn)派生類:
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)方式的動態(tài)配置:
demoClass* demo = new demoClass;
demoClassImpl1* impl1 = new demoClassImpl1;
demo->impl = impl1;
demo->func();demoClassImpl2* impl2 = new demoClassImpl2;
demo->impl = impl2;
demo->func();
原文鏈接:https://blog.csdn.net/lizhichao410/article/details/125930011
相關(guān)推薦
- 2022-04-18 修改taro-ui的樣式,在自定義組件中使用taro-ui,修改ui框架樣式
- 2022-09-02 R語言數(shù)據(jù)結(jié)構(gòu)之矩陣、數(shù)組與數(shù)據(jù)框詳解_R語言
- 2023-03-28 Python利用flask操作Redis的方法詳解_python
- 2022-10-29 qt輸出自定義的pdf文件源碼詳解
- 2022-08-15 常見哈希算法、Hmac算法和BouncyCastle
- 2022-12-12 Android?DataBinding類關(guān)系深入探究_Android
- 2022-05-27 python中torch.nn.identity()方法詳解_python
- 2023-02-14 教你使用SQL語句進(jìn)行數(shù)據(jù)庫復(fù)雜查詢_MsSql
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支