C++編程技巧降低編譯時間

來源:互聯網
上載者:User

標籤:編譯器   分離   sso   項目   forward   fill   匯入   span   唯一性   

1. #define的保護
全部標頭檔都應該使用#define 防止標頭檔被多重包括(multiple inclusion)。命名格式
當是:<PROJECT>_<PATH>_<FILE>_H_
為保證唯一性,標頭檔的命名應基於其所在項目源碼樹的全路徑。比如,項目foo 中的頭
檔案foo/src/bar/baz.h 按例如以下方式保護:
#ifndef FOO_BAR_BAZ_H_
#define FOO_BAR_BAZ_H_
...

#endif // FOO_BAR_BAZ_H_

2. 標頭檔依賴
使用前置聲明(forward declarations)盡量降低.h 檔案裡#include 的數量。
當一個標頭檔被包括的同一時候也引入了一項新的依賴(dependency),僅僅要該標頭檔被改動。
代碼就要又一次編譯。假設你的標頭檔包括了其它標頭檔。這些標頭檔的不論什麼改變也將導致那
些包括了你的標頭檔的代碼又一次編譯。

因此,我們寧可盡量少包括標頭檔。尤其是那些包括
在其它標頭檔裡的。
使用前置聲明能夠顯著降低須要包括的標頭檔數量。

舉例說明:標頭檔裡用到類File。但不
須要訪問File 的聲明,則標頭檔裡僅僅需前置聲明class File;無需#include
"file/base/file.h"。
在標頭檔怎樣做到使用類Foo 而無需訪問類的定義?
1) 將資料成員型別宣告為Foo *或Foo &;
2) 參數、返回值類型為Foo 的函數僅僅是聲明(但不定義實現);
3) 待用資料成員的類型能夠被聲明為Foo,由於待用資料成員的定義在類定義之外。
還有一方面,假設你的類是Foo 的子類,或者含有類型為Foo 的非待用資料成員,則必須為
之包括標頭檔。


有時。使用指標成員(pointer members。假設是scoped_ptr 更好)替代對象成員(object
members)的確更有意義。

然而,這種做法會減少代碼可讀性及運行效率。假設只為
了少包括標頭檔。還是不要這樣替代的好。

當然,.cc 檔案不管怎樣都須要所使用類的定義部分,自然也就會包括若干標頭檔。
譯者註:能依賴聲明的就不要依賴定義。


以上是Google中C++編程規範的前兩條要求。第一條相信大家都知道。第二條就是我要說的問題了。

這裡我用VS2012解釋下這個事情。要降低編譯的目的就是要降低#include;

那我們先定義這樣兩個類:

#pragma onceclass A{public:A(void);~A(void);};

#pragma once#include "A.h"class B{public:B(void);~B(void);private:A a;};

能夠看到這是非常easy的組合類別的情況。B類中有個A的對象。以下我們產生一下。


這時候A。B第一次編譯成功

接下來我們改動對象A,在對象A中添加一個私人成員i,B不變;

#pragma onceclass A{public:A(void);~A(void);private:int i;};

這時候再產生一次,能夠看到例如以下情況

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVlanVlbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >


能夠看到A編譯後。編譯器發現B中匯入了A.h然後又編譯了一次B。

在project量比較小的時候這麼做是沒關係的。但當你編譯一次代碼須要1分鐘2分鐘的時候。我們頻繁的改動原始碼然後編譯你會崩潰的是不是?

所以前置聲明是一個能夠選擇的解決方式。

B的代碼僅僅要做例如以下改動,取消匯入A.h在B.h中聲明class A;

#pragma onceclass A;class B{public:B(void);~B(void);privateA* a;};

我們相同在A沒改動之前做一次編譯。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVlanVlbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

相同我們在A中增加私人成員後再編譯一次。


能夠看到這裡僅僅編譯了A.cpp檔案。

這樣的原因就是事實上是C++的聲明與定義並未全然分離的緣故。像Java就不會有這樣的問題=。

=




C++編程技巧降低編譯時間

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.