[C/C++]移除編譯依賴的小技巧

posted in: 未分類 | 0

相信有不少人有這種經驗:如果所處理的是一個非常大型的專案,常常更改一些小東西就要等個10幾20分的編譯時間。那麼我們該怎麼處理這個問題呢?

以下內容見exceptional c++ item26 ~ item 28:

// file x.h 
class X
{
  // public and protected members
private:
  struct XImpl;// a pointer to a forward-declared class 
  XImpl* pimpl_;
  // a pointer to a forward-declared class
};
 
// file x.cpp
struct X::XImpl
{
  // private members; fully hidden, can be
  // changed at will without recompiling clients
};

 

使用這種方法,可以減少header更動時,相關的cpp檔必須重新編譯的時間。此技巧稱為pimpl idiom。

一個對良好的header檔,對其所依賴的其他h檔應該越少越好,具體作法如下:

//  x.h: after removing unnecessary inheritance 
//
#include <iosfwd>
#include "a.h"  // class A
class B;
class C;
class E;
class X : public A
{
   public:
       X( const C& );
       B  f( int, char* );
       C  f( int, C );
       C& g( B );
       E  h( E );
       virtual std::ostream& print( std::ostream& ) const;
   private:
       struct XImpl;
       XImpl* pimpl_; 
 };
inline std::ostream& operator<<( std::ostream& os, const X& x )
{
   return x.print(os);
}

其中BCE由於只有在方法參數及return中出現,由於不會影響到該class的大小(二進制布局),因此不需要去include該header,而只要在前面宣告:

class B;

class C;

class E;

即可,另外由於其private member已經用pimpl idom的方法將其從介面中隔絕了,因此我們所設計的這個X class的header檔就可以變的非常的精簡,而大部份參與實作的檔案都被隔絕到cpp檔中才include。

Leave a Reply

Your email address will not be published. Required fields are marked *