為什麼編譯要花這麼長的時間?

2021-08-29 09:11:02 字數 1493 閱讀 7801

你的編譯器可能有問題。也許它太老了,也許你安裝它的時候出了錯,也許你用的計算機已經是個古董。在諸如此類的問題上,我無法幫助你。

但是,這也是很可能的:你要編譯的程式設計得非常糟糕,以至於編譯器不得不檢查數以百計的標頭檔案和數萬行**。理論上來說,這是可以避免的。如果這是你購 買的庫的設計問題,你對它無計可施(除了換乙個更好的庫),但你可以將你自己的**組織得更好一些,以求得將修改**後的重新編譯工作降到最少。這樣的設 計會更好,更有可維護性,因為它們展示了更好的概念上的分離。

看看這個典型的物件導向的程式例子:

class shape ;

class circle : public shape

// ...

protected:

int radius;

// ...};

class ******** : public shape ;

設計思想是,使用者通過shape的public介面來操縱它們,而派生類(例如circle和********)的實現部分則共享由protected成員表現的那部分實現(implementation)。

然而,這個簡單的設計理念裡卻隱含著三個嚴重的問題:

於是,基類中的「實現相關的資訊」(information helpful to implementers)對使用者來說變成了象介面一樣敏感的東西,它的存在導致了實現部分的不穩定,使用者**的無謂的重編譯(當實現部分發生改變時),以及將標頭檔案無節制地包含進使用者**中(因為「實現相關的資訊」需要它們)。有時這被稱為「脆弱的基類問題」(brittle base class problem)。

乙個很明顯的解決方案就是,忽略基類中那些象介面一樣被使用的「實現相關的資訊」。換句話說,使用介面,純粹的介面。也就是說,用抽象基類的方式來表示介面:

class shape ;

class circle : public shape

point center() const

// ...

protected:

point cent;

color col;

int radius;

// ...};

class ******** : public shape ;  

現在,使用者**與派生類的實現部分的變化之間的關係被隔離了。我曾經見過這種技術使得編譯的時間減少了幾個數量級。

但是,如果確實存在著對所有派生類(或僅僅對某些派生類)都有用的公共資訊時怎麼辦呢?可以簡單把這些資訊封裝成類,然後從它派生出實現部分的類:

class shape ;

struct common ;

class circle : public shape, protected common

point center() const

// ...

protected:

point cent;

int radius;};

class ******** : public shape, protected common ; 

為什麼你開發的專案要花這麼長時間?

t,testing time 是我們要做的事情,也是很多混亂被引入的的地方。當我們談論我們正在工作的內容時,大多數測試人員用 我正在測試新的報告功能 或 我正在構建來自於最後衝刺用於批量載入功能的自動操作 來報告狀態。這些宣告是準確,肯定的,但他們也可以隱藏了所有你不得不做的其他工作。如果我們想獲得...

Time wait為什麼是2MSL的時間長度?

1 time wait 多久才會自動關閉 2 time wait時長多少 3 為什麼tcp的time wait狀態要保持2msl?4 tcp的四次揮手 為了保證客戶端傳送的最後乙個ack報文段能夠到達伺服器。這個ack報文段可能丟失,因而使在last ack狀態的伺服器收不到對已傳送的fin ack...

為什麼開發效率這麼低,時間都去哪了

在埋頭打碼的時候,總會雲遊天外思考點人生問題,回過神來吐槽自己 開發效率為何這麼低!明明實現的業務邏輯並不是很複雜,量也不會太多,為什麼專案的開發要那麼久?時間到底去哪了?一次兩次的問題,或許我們不會在意。但頻頻爆發的問題,這就值得我們深思了。這不是個單因單果的問題,找出潛在的可能因素,才能給出針對...