冗餘包含衛哨如何加快編譯速度?

2021-05-23 10:02:08 字數 1066 閱讀 5621

最近讀了兩本書,一本是《大規模c++程式設計》,另一本是《c++必知必會》。

裡面都有提到衛哨這個概念,譬如包含衛哨(內部衛哨)和冗餘包含衛哨(外部衛哨)。

其實包含衛哨大家平時程式設計過程中是用的特別特別多的,

#ifndef hdr1_h

#define hdr1_h

//標頭檔案的實際內容

#endif

如果面試過程中問到這個有什麼作用,相信很多童鞋都能應答自如的了。

但其實真正讓我感興趣的是冗餘包含衛哨,或者叫外部衛哨。

#ifndef hdr1_h

#include 「hdr1.h」

#endif

按書上面的說法是,針對大型專案,特別是標頭檔案多,標頭檔案行數多,

使用冗餘包含衛哨能提高編譯速度,甚至成倍(這個在《大規模》一書中有具體測試資料)。

我對它提提高編譯速度很感興趣,同時對它是如何能夠提高編譯速度更感興趣了。

按照《c++必知必會》的說法,是因為「開啟乙個標頭檔案、驗證#ifndef並掃瞄結束符#endif」這個過程非常耗時。

對照上面的解析,我們重點分析:

1、開啟乙個標頭檔案費時?

如果重複性開啟又多又大的標頭檔案,的確會耗費時間。

2、驗證#ifndef費時?

這個不太成立,作為乙個布林判斷,花不了幾個指令。

同時,冗餘包含衛哨本身就帶有乙個#ifndef的判斷了,所以這個猜測不成立。

3、掃瞄結束符#endif費時?

如果標頭檔案很大,也就是行數很多,掃瞄的確是件費時的工作。特別是需要在同乙個很大的標頭檔案中重複這樣做。

個人不清楚預編譯器是如何實現的,但對是否有必要掃瞄#endif表示懷疑。

如果#ifndef不成立,代表該檔案已經定義過了,為什麼還非要掃瞄#endif呢?為什麼不馬上結束?

難道是必須滿足#ifndef和#endif配對的語法要求,所以就堅持掃瞄?

基於上面的3點分析,個人覺得耗時的最大可能就是第3點,然後是第1點,至於第2點,不認同。

另外,為什麼冗餘包含衛哨在標頭檔案有用,在cpp檔案無用呢?

這個問題可能需要對預編譯器實現流程熟悉才能比較合理的解析了。

劍指Offer對答如流系列 包含min函式的棧

定義棧的資料結構,請在該型別中實現乙個能夠得到棧的最小元素的min函式。在該棧中,呼叫min push及pop的時間複雜度都是o 1 push 和 pop均容易實現。主要就是min函式的定義,如果要通過操作push和pop操作獲取最小元素時間複雜度為o 1 基本上是不可能的。如果我們另外定義乙個成員...