http://www.shnenglu.com/CornerZhang/archive/2009/04/13/79004.html
內(nèi)容如下:
頭文件依賴(lài),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中依賴(lài)的使用類(lèi)型會(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給這種技巧稱(chēng)為Pimpl ( Private Implemention ), 用的恰到好處時(shí),可以提高項(xiàng)目開(kāi)發(fā)速度,同時(shí)模塊的頭文件間的#include關(guān)系得以緩解,可以避開(kāi)循環(huán)依賴(lài),而且可以獲得一個(gè)良好的物理設(shè)計(jì)。
總結(jié):
Pimpl方法感覺(jué)很不錯(cuò),
使用這個(gè)方法的時(shí)候,一定要注意的是在這個(gè)地方的變化,這個(gè)是我第二遍看的時(shí)候才注意到的.
class SoundSystem {
public:
// ...
private:
StreamFilter currentFilter;
EmitModeConfig modeConfig;
};
采用Pimpl方法后,變?yōu)?br> class SoundSystem {
public:
// ...
private:
StreamFilter* currentFilterPtr;
EmitModeConfig* modeConfigPtr;
};
所以在.cpp文件中就有了new和delete的操作.
對(duì)于這種方法有一個(gè)疑問(wèn)?對(duì)于那種存在包含眾多類(lèi)的情況下,這種方法的駕馭不是一般人能夠掌握的吧.或許這種方法就不太使用了,不如等待一會(huì),編譯.