6 頭文件依賴,Pimpl法,加速編譯
???舉個(gè)例子:
??????// File: SoundSystem.h
??????#include "StreamFilter.h"
??????#include "Emitters."
??????class SoundSystem {
??????public:
?????????// ...
??????private:
?????????StreamFilter?currentFilter;
?????????EmitModeConfig modeConfig;
??????};
???一目了然的是,看得出SoundSystem實(shí)現(xiàn)使用了StreamFilter和EmitModeConfig的定義,所以#include 了他們的定義在此SoundSystem.h中,可是隨著項(xiàng)目的不斷推進(jìn),class SoundSystem中依賴的使用類型會(huì)增多,它的header被引入到其它模塊中,不知不覺(jué)的編譯時(shí)間越來(lái)越長(zhǎng),改進(jìn)之:
??????// File: SoundSystem.h
??????class StreamFilter;
??????class EmitModeConfig;
??????class SoundSystem {
??????public:
?????????// ...
??????private:
?????????StreamFilter*?currentFilterPtr;
?????????EmitModeConfig* modeConfigPtr;
??????};
??????// File: SoundSystem.cpp
??????#include "StreamFilter.h"
??????#include "Emitters."
??????SoundSystem::SoundSystem() {
?????????//...
?????????currentFilterPtr = new StreamFilter;
?????????modeConfigPtr = new EmitModeConfig;
??????}
??????SoundSystem::~SoundSystem() {
?????????delete currentFilterPtr;
?????????delete modeConfigPtr;
?????????//...
??????}
??????這么一來(lái),把StreamFilter和EmitModeConfig的#include藏到了SoundSystem的實(shí)現(xiàn)代碼中,以后對(duì)SoundSystem的部分改動(dòng)不會(huì)導(dǎo)致其它模塊的rebuild哦,不過(guò)由此可能會(huì)犧牲一點(diǎn)效率吧!
??????記得,有位微軟的C++翹楚人物,Herb Sutter給這種技巧稱為Pimpl ( Private Implemention ), 用的恰到好處時(shí),可以提高項(xiàng)目開(kāi)發(fā)速度,同時(shí)模塊的頭文件間的#include關(guān)系得以緩解,可以避開(kāi)循環(huán)依賴,而且可以獲得一個(gè)良好的物理設(shè)計(jì)。
( to be continued )