最近讀了兩本書,一本是《大規模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 基本上是不可能的。如果我們另外定義乙個成員...