亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

減少C++代碼編譯時間的簡單方法(必看篇)

2020-01-26 14:18:37
字體:
來源:轉載
供稿:網友

c++ 的代碼包含頭文件和實現文件兩部分, 頭文件一般是提供給別人(也叫客戶)使用的, 但是一旦頭文件發生改變,不管多小的變化,所有引用他的文件就必須重新編譯,編譯就要花時間,假如你做的工程比較大(比如二次封裝chrome這類的開發),重新編譯一次的時間就會浪費上班的大部分時間,這樣干了一天挺累的, 但是你的老板說你沒有產出,結果你被fired, 是不是很怨啊, 如果你早點看到這段文章,你就會比你的同事開發效率高那么一些,那樣被fired就不會是你了,你說這篇文章是不是價值千金!開個玩笑 :)

言歸正傳,怎樣介紹編譯時間呢, 我知道的就3個辦法:

1. 刪除不必要的#include,替代辦法 使用前向聲明 (forward declared )

2. 刪除不必要的一大堆私有成員變量,轉而使用 "impl" 方法

3. 刪除不必要的類之間的繼承

為了講清楚這3點,還是舉個實例比較好,這個實例我會一步一步的改進(因為我也是一點一點摸索出來了,如果哪里說錯了, 你就放心的噴吧,我會和你在爭論到底的,呵呵)

現在先假設你找到一個新工作,接手以前某個程序員寫的類,如下

// old.h: 這就是你接收的類   //   #include <iostream>   #include <ostream>   #include <list>    // 5 個 分別是file , db, cx, deduce or error , 水平有限沒有模板類   // 只用 file and cx 有虛函數.   #include "file.h" // class file   #include "db.h" // class db   #include "cx.h" // class cx   #include "deduce.h" // class deduce   #include "error.h" // class error    class old : public file, private db {   public:     old( const cx& );    db get_db( int, char* );    cx get_cx( int, cx );    cx& fun1( db );    error fun2( error );    virtual std::ostream& print( std::ostream& ) const;   private:    std::list<cx> cx_list_;    deduce    deduce_d_;   };    inline std::ostream& operator<<( std::ostream& os,const old& old_val )    { return old_val.print(os); }

這個類看完了, 如果你已經看出了問題出在哪里, 接下來的不用看了, 你是高手, 這些基本知識對你來說太小兒科,要是像面試時被問住了愣了一下,請接著看吧

先看怎么使用第一條: 刪除不必要的#include

這個類引用 5個頭文件, 那意味著那5個頭文件所引用的頭文件也都被引用了進來, 實際上, 不需要引用5 個,只要引用2個就完全可以了

1.刪除不必要的#include,替代辦法 使用前向聲明 (forward declared )

1.1刪除頭文件 iostream, 我剛開始學習c++ 時照著《c++ primer》 抄,只要看見關于輸入,輸出就把 iostream 頭文件加上, 幾年過去了, 現在我知道不是這樣的, 這里只是定義輸出函數, 只要引用ostream 就夠了

1.2.ostream頭文件也不要, 替換為 iosfwd , 為什么, 原因就是, 參數和返回類型只要前向聲明就可以編譯通過, 在iosfwd 文件里 678行(我的環境是vs2013,不同的編譯環境具體位置可能會不相同,但是都有這句聲明) 有這么一句

typedef basic_ostream<char, char_traits<char> > ostream;inline std::ostream& operator<<( std::ostream& os,const old& old_val ){ return old_val.print(os); }

除此之外,要是你說這個函數要操作ostream 對象, 那還是需要#include <ostream> , 你只說對了一半, 的確, 這個函數要操作ostream 對象, 但是請看他的函數實現,

里面沒有定義一個類似 std::ostream os, 這樣的語句,話說回來,但凡出現這樣的定義語句, 就必須#include 相應的頭文件了 ,因為這是請求編譯器分配空間,而如果只前向聲明 class XXX; 編譯器怎么知道分配多大的空間給這個對象!

看到這里, old.h頭文件可以更新如下了:

// old.h: 這就是你接收的類   //   #include <iosfwd> //新替換的頭文件   #include <list>    // 5 個 分別是file , db, cx, deduce or error , 水平有限沒有模板類   // 只用 file and cx 有虛函數.   #include "file.h" // class file , 作為基類不能刪除,刪除了編譯器就不知道實例化old 對象時分配多大的空間了   #include "db.h" // class db, 作為基類不能刪除,同上   #include "cx.h" // class cx   #include "deduce.h" // class deduce   // error 只被用做參數和返回值類型, 用前向聲明替換#include "error.h"    class error;    class old : public file, private db {   public:     old( const cx& );    db get_db( int, char* );    cx get_cx( int, cx );    cx& fun1( db );    error fun2( error );    virtual std::ostream& print( std::ostream& ) const;   private:    std::list<cx> cx_list_; // cx 是模版類型,既不是函數參數類型也不是函數返回值類型,所以cx.h 頭文件不能刪除    deduce    deduce_d_; // deduce 是類型定義,也不刪除他的頭文件   };    inline std::ostream& operator<<( std::ostream& os,const old& old_val )    { return old_val.print(os); }

到目前為止, 刪除了一些代碼, 是不是心情很爽,據說看一個程序員的水平有多高, 不是看他寫了多少代碼,而是看他少寫了多少代碼。

如果你對C++ 編程有更深一步的興趣, 接下來的文字你還是會看的,再進一步刪除代碼, 但是這次要另辟蹊徑了

2. 刪除不必要的一大堆私有成員變量,轉而使用 "impl" 方法

2.1.使用 "impl" 實現方式寫代碼,減少客戶端代碼的編譯依賴

impl 方法簡單點說就是把 類的私有成員變量全部放進一個impl 類, 然后把這個類的私有成員變量只保留一個impl* 指針,代碼如下

// file old.h   class old {    //公有和保護成員    // public and protected members   private:   //私有成員, 只要任意一個的頭文件發生變化或成員個數增加,減少,所有引用old.h的客戶端必須重新編譯    // private members; whenever these change,    // all client code must be recompiled   };

改寫成這樣:

// file old.h   class old {   //公有和保護成員    // public and protected members   private:    class oldImpl* pimpl_;    // 替換原來的所有私有成員變量為這個impl指針,指針只需要前向聲明就可以編譯通過,這種寫法將前向聲明和定義指針放在了一起, 完全可以。    //當然,也可以分開寫     // a pointer to a forward-declared class   };    // file old.cpp   struct oldImpl {   //真正的成員變量隱藏在這里, 隨意變化, 客戶端的代碼都不需要重新編譯    // private members; fully hidden, can be    // changed at will without recompiling clients   };

不知道你看明白了沒有, 看不明白請隨便寫個類試驗下,我就是這么做的,當然凡事也都有優缺點,下面簡單對比下:

使用impl 實現類

不使用impl實現類

優點

類型定義與客戶端隔離, 減少#include 的次數,提高編譯速度,庫端的類隨意修改,客戶端不需要重新編譯

直接,簡單明了,不需要考慮堆分配,釋放,內存泄漏問題

缺點

對于impl的指針必須使用堆分配,堆釋放,時間長了會產生內存碎片,最終影響程序運行速度, 每次調用一個成員函數都要經過impl->xxx()的一次轉發

庫端任意頭文件發生變化,客戶端都必須重新編譯

改為impl實現后是這樣的:

// 只用 file and cx 有虛函數.   #include "file.h"    #include "db.h"    class cx;   class error;    class old : public file, private db {   public:     old( const cx& );    db get_db( int, char* );    cx get_cx( int, cx );    cx& fun1( db );    error fun2( error );    virtual std::ostream& print( std::ostream& ) const;   private:class oldimpl* pimpl; //此處前向聲明和定義   };    inline std::ostream& operator<<( std::ostream& os,const old& old_val )    { return old_val.print(os); } //implementation file old.cppclass oldimpl{std::list<cx> cx_list_;deduce    dudece_d_;};

3. 刪除不必要的類之間的繼承

面向對象提供了繼承這種機制,但是繼承不要濫用, old class 的繼承就屬于濫用之一, class old 繼承file 和 db 類, 繼承file是公有繼承,繼承db 是私有繼承,繼承file 可以理解, 因為file 中有虛函數, old 要重新定義它, 但是根據我們的假設, 只有file 和 cx 有虛函數,私有繼承db 怎么解釋?! 那么唯一可能的理由就是:

通過 私有繼承―讓某個類不能當作基類去派生其他類,類似Java里final關鍵字的功能,但是從實例看,顯然沒有這個用意, 所以這個私有繼承完全不必要, 應該改用包含的方式去使用db類提供的功能, 這樣就可以

把"db.h"頭文件刪除, 把db 的實例也可以放進impl類中,最終得到的類是這樣的:

// 只用 file and cx 有虛函數.   #include "file.h"    class cx;   class error;   class db;   class old : public file {   public:     old( const cx& );    db get_db( int, char* );    cx  get_cx( int, cx );    cx& fun1( db );    error fun2( error );    virtual std::ostream& print( std::ostream& ) const;   private:    class oldimpl* pimpl; //此處前向聲明和定義   };    inline std::ostream& operator<<( std::ostream& os,const old& old_val )    { return old_val.print(os); } //implementation file old.cppclass oldimpl{std::list<cx> cx_list_;deduce    dudece_d_;};

小結一下:

這篇文章只是簡單的介紹了減少編譯時間的幾個辦法:

1. 刪除不必要的#include,替代辦法 使用前向聲明 (forward declared )

2. 刪除不必要的一大堆私有成員變量,轉而使用 "impl" 方法

3. 刪除不必要的類之間的繼承

這幾條希望對您有所幫助, 如果我哪里講的不夠清楚也可以參考附件,哪里有完整的實例,也歡迎您發表評論, 大家一起討論進步,哦不,加薪。 呵呵,在下篇文章我將把impl實現方式再詳細分析下,期待吧...

以上就是小編為大家帶來的減少C++代碼編譯時間的簡單方法(必看篇)全部內容了,希望大家多多支持武林網~

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人免费av电影| 亚洲男人第一av网站| 懂色aⅴ精品一区二区三区蜜月| 亚洲91精品在线观看| 精品国产一区二区三区在线观看| 亚洲激情国产精品| 国产精品入口福利| 中文字幕亚洲情99在线| 亚洲图片欧洲图片av| 奇米成人av国产一区二区三区| 姬川优奈aav一区二区| 尤物99国产成人精品视频| 国产91av在线| 国产精品99久久久久久白浆小说| 国产精品视频xxxx| 欧美亚洲视频在线看网址| 久久久www成人免费精品张筱雨| 91最新在线免费观看| 国产精品久久久久久久久久久久| 欧美日韩亚洲一区二区| 午夜精品三级视频福利| 欧美成人精品在线观看| 4k岛国日韩精品**专区| 久久成年人视频| 色狠狠av一区二区三区香蕉蜜桃| 亚洲品质视频自拍网| 久久久97精品| 日韩一二三在线视频播| 日韩免费电影在线观看| 国产精品免费福利| 欧美日韩亚洲视频一区| 日韩视频免费中文字幕| 精品精品国产国产自在线| 欧美乱大交xxxxx| 欧美性69xxxx肥| 精品成人69xx.xyz| 国产精品高潮在线| 全亚洲最色的网站在线观看| 九九热精品在线| 国产欧美一区二区| 国产丝袜精品第一页| 亚洲电影天堂av| 一区二区三区四区精品| 欧美亚洲伦理www| 欧美激情xxxx| 亚洲精品综合精品自拍| 狠狠做深爱婷婷久久综合一区| 少妇激情综合网| 国产亚洲精品久久久| 日韩欧美在线视频日韩欧美在线视频| 精品国产一区二区在线| 成人av.网址在线网站| 国产精品久久久久久久久久东京| 久久噜噜噜精品国产亚洲综合| 精品无人国产偷自产在线| 亚洲视屏在线播放| 国产精品视频地址| 欧美成人亚洲成人| 亚洲欧美另类自拍| 欧美一级淫片videoshd| 美女精品视频一区| 国产在线精品播放| 亚洲精品视频在线观看视频| 91亚洲va在线va天堂va国| 国产婷婷成人久久av免费高清| 亚洲激情视频网站| 久久免费精品视频| 国产精品999| 日韩中文在线观看| 日韩视频免费在线观看| 欧美成人精品一区二区三区| 日韩有码在线视频| 欧美性猛交xxxx富婆弯腰| 国产精品老牛影院在线观看| 日韩成人中文字幕在线观看| 亚洲精品在线观看www| 色伦专区97中文字幕| 日本aⅴ大伊香蕉精品视频| 最近2019年中文视频免费在线观看| 国产精品户外野外| 国产精品男人爽免费视频1| 久久九九全国免费精品观看| 国产精品久久久久aaaa九色| 国产激情久久久久| 97精品国产97久久久久久免费| 亚洲综合精品一区二区| 欧美高清电影在线看| 久久香蕉精品香蕉| 欧美高清视频在线播放| 欧美一区亚洲一区| 久久人人爽人人爽人人片av高请| 色樱桃影院亚洲精品影院| 亚洲va欧美va国产综合久久| 国模视频一区二区三区| 国产精品美女久久久久av超清| 亚洲人精选亚洲人成在线| 久久人人爽人人爽爽久久| 欧美激情精品久久久久久大尺度| 国产精品美女www| 91精品国产777在线观看| 欧美国产高跟鞋裸体秀xxxhd| 欧美超级免费视 在线| 日韩精品高清在线观看| 欧美性xxxxhd| 亚洲护士老师的毛茸茸最新章节| 日产精品99久久久久久| 国产精品高潮呻吟视频| 91久久久久久国产精品| 精品久久久久久国产91| 欧美日韩第一视频| 亚洲视频999| 91av视频在线观看| 久久成人18免费网站| 国产精品视频一| 久久久精品久久| 亚洲国产精品一区二区三区| 国产精品久久久久久亚洲影视| 美女啪啪无遮挡免费久久网站| 精品久久久视频| 欧美一区二区视频97| 国产一区二区黄| 久久av在线播放| 51色欧美片视频在线观看| 欧美国产中文字幕| 日本一区二区在线免费播放| 国产综合色香蕉精品| 欧美成人亚洲成人| 久久成人精品电影| 欧美日韩免费一区| 亚洲丁香婷深爱综合| 国语自产偷拍精品视频偷| 91久久中文字幕| 亚洲国产成人一区| 在线播放精品一区二区三区| www.亚洲成人| 91国偷自产一区二区三区的观看方式| 亚洲丝袜在线视频| 亚洲国产精品va在线看黑人| 亚洲影院高清在线| 国产丝袜一区二区三区免费视频| 岛国av在线不卡| 亚洲精品wwww| 国产精品电影久久久久电影网| 精品久久久久久久久久久久久| 亚洲人成欧美中文字幕| 久久网福利资源网站| 亚洲精品国产福利| 伊人久久综合97精品| 亚洲精品中文字幕女同| 国内精品久久久久久中文字幕| 亚洲精品日产aⅴ| 日本精品视频在线| 亚洲成人aaa| 色av中文字幕一区| 日韩电视剧免费观看网站| 亚洲高清福利视频| 亚洲欧美日韩中文在线| 91久久国产婷婷一区二区| 欧美色欧美亚洲高清在线视频| 91黄色8090| 国产精品偷伦视频免费观看国产| 日韩欧美有码在线| 伊是香蕉大人久久| 欧美孕妇与黑人孕交|