C 程式設計技巧 Pimpl機制

2021-09-08 16:20:37 字數 1683 閱讀 8141

出處:

1.簡介

這個機制是private implementation的縮寫,我們常常聽到諸如「不要改動你的公有介面」這樣的建議,所以我們一般都會修改私有介面,但是這會導致包含該標頭檔案的所有原始檔都要重新編譯,這會是個麻煩事兒。pimpl機制,顧名思義,將實現私有化,力圖使得標頭檔案對改變不透明。

2.機制分析

首先,我們先看看不使用這個機制的乙個實現:

1: // mybase.h
2: class mybase ;
6:
7: // myderived.h
8: #include "mybase.h"
9: class myderived : public mybase ;
假設你現在希望在mybase.h中加入乙個新的private和protected成員函式,那麼myderived和所有包含mybase.h的原始檔都需要重新編譯。在乙個大工程中,這樣的修改可能導致重新編譯時間的激增。你可以使用doxygen或者scitools看看標頭檔案依賴。

一般來說,不在標頭檔案中包含標頭檔案是乙個比較好的習慣,但是這也不能完全消除修改mybase.h帶來的重新編譯代價。有沒有乙個機制可以使得對私有介面做修改時我們可以減小重新編譯的代價。

在pimpl機制中,我們使用前置宣告乙個impl類,並將這個類的乙個指標例項放入主類中,如下:

1: // myclass.h
2: class myclassimpl;    // forward declaration
3: class myclass ;
現在,除非我們修改myclass的公有介面,否則這個標頭檔案是不會被修改了。然後,我們用這個impl類的實現來完成主類的細節實現,在主類的建構函式中,我們完成了實現類指標的例項化:

1: // myclass.cpp
2: class myclassimpl
7: int bar()
8:         int var;
9: };
10:
11: myclass::myclass() : m_pimpl(new myclassimpl){}
12:
13: myclass::~myclass()
14:
18:     catch (...) {}
19: }
20:
21: int myclass::foo()
pimpl機制其實這是橋接模式的一種變種。我們可以對實現類隨意的進行增刪和修改,而不會導致包含myclass.h的源**重新編譯。當然,這樣做的時間開銷和空間開銷也是有的。

在實踐中,我們常常採用內部類來完成pimpl機制:

1: // header
2: class fruit
3:
10:
11: // implementation
12: class fruit::impl
13: ;
16:
17: fruit::fruit()
18:

C 程式設計技巧

c 程式設計技巧 c 語言是乙個物件導向的語言,使用c 編寫的 更加簡捷 高效,更具可維護性和可重用性。但是很多人使用了c 語言後卻感到c 與c程式設計沒有什麼區別。這其實是由於對c 語言的特點和特色理解和使用不夠造成的。事實上,沒有任何乙個程式設計師使用c語言的程式設計效率可以超過c 語言的。一 ...

C 程式設計技巧

c 程式設計技巧 一 使用new和delete進行動態記憶體分配和釋放 運算子new和delete是c 新增的過算符,提供了儲存的動態分配和釋放功能。它的作用相當於c語言的函式malloc 和free 但是效能更為優越。使用new比使用malloc 有以下的幾個優點 1 new自動計算要分配型別的大...

C 程式設計技巧

1 遵循程式設計規範,例如公司的程式設計規範 google c 程式設計規範 等 2 小就是美 簡單就是美 3 盡可能多的使用 const 修飾符 4 宣告即初始化 變數 物件宣告時就初始化 5 結構 類等例項變數都以指標變數的方式使用 6 始終在使用前檢測指標變數的有效性 7 指標和標量型別使用值...