標籤:

在C++11中,auto關鍵字的大量使用,會影響編譯速度嗎?

在C++11中,auto關鍵字的大量使用,會影響編譯速度嗎?

按照C++11 FAQ的說法,應該是不會,可是我無法理解為什麼不會

求詳細解釋,謝謝.


因為本來也要右側推導然後判斷與左側是否匹配。


不會,因為編譯器肯定是要知道並跟蹤每一個類型的,否則無法做匹配和檢查。並不會因為auto就增加編譯器開銷。


你去寫過 bidirectional type inference 就知道了,對於非 rec 的綁定,加類型局部變數的聲明甚至會比不加的更慢,因為多一次 unify(以及一個潛在的 coercion)。

bidirectional typechecker 一般長這樣

-- 你可以認為 TC 是 EitherT (StateT (List (Name * Type)) IO)。
-- StateT 處理變數綁定,EitherT 處理異常,IO 處理 Meta Type Variable 的可變綁定
Monad TC where ...

-- infer x : 在當前上下文中推理項 x 的類型,返回類型和修飾過的項或者異常
infer : Term -&> TC (Type * Term)
-- check x t : 在當前上下文中檢查項 x 的類型是否為 t,返回修飾過的項或者異常
check : Term -&> Type -&> TC Term
-- unify tActual tExpected : 在當前上下文中將類型 tActual 合一到 tExpected,返回一個約制或者異常
unify : Type -&> Type -&> TC (Term -&> Term)
-- introduce n t m : 在當前上下文中引入一個新變數 n:t,在衍生的上下文內執行檢查 m
introduce : Name -&> Type -&> TC a -&> TC a

對一般的 let:

infer (LET name binding body) = do
(t, b1) &<- infer binding introduce name t $ do (t1, body1) &<- infer body return (t1, ANN (LET name b1 body1) t1)

對帶類型聲明的 let:

infer (LET_ANN name type binding body) = do
b1 &<- check binding type introduce name type $ do (t1, body1) &<- infer body return (t1, ANN (LET name b1 body1) t1)

而一般情況下 check 定義是啥呢?

check term type = do
(t1, term1) &<- infer term coercion &<- unify t1 type return (coercion term1)

兩者對比可以看到,我們多了一次 unify 運算和一次 coercion 調用。

對於 let-rec 情況則又不一樣了:

newMetaTypeVar : TC Type

infer (LET_REC name binding body) = do
assumed &<- newMetaTypeVar b1 &<- introduce name assumed $ check binding assumed introduce name assumed $ do (t1, body1) &<- infer body return (t1, ANN (LET name b1 body1) t1) infer (LET_REC_ANN name type binding body) = do b1 &<- introduce name type $ check binding type introduce name type $ do (t1, body1) &<- infer body return (t1, ANN (LET name b1 body1) t1)


在auto出現之前,

C++需要先推導等號右側表達式的類型,

然後檢查它與變數的類型是否可以轉換(例如兼容轉換、向下類型轉換和自定義類型轉換)。

在auto出現之後,

C++在推導出等號右側表達式的類型之後,

直接指定給變數。

檢查的過程變成了指定的過程,時間上可以認為差別不大。


誰在意這個?

講真,能順利編譯且邏輯對了,順便還能賺點喝茶時間,也挺好。


沒有測試就別隨便下結論或者杞人憂天吧。。。

編譯器在處理XX a=b時,不管XX是auto還是非auto 一樣要去查看b的類型的,並且需要確認可以拷貝構造。所以理論上來講只會減少編譯時間,包括非自定義類型也類似。


Premature optimization is the root of all evil

類型推導(通常)並不是個很難的事情,你更應該關心一下 template 展開的開銷。


不會,對於編譯器來說,它一直知道某個類型的。我反而覺得會加快編譯速度,少了一些錯誤的判斷。


抖個機靈:

auto 只有4個字元,字元更少,所以更快.


推薦閱讀:

為什麼 64 位操作系統的庫目錄要和 32 位不同?
什麼是下一代編譯型語言?
如何編寫將彙編代碼翻譯成機器碼的程序?
clang編譯CUDA程序,為何會生成多個LLVM bitcode文件?
為什麼有了 遞歸, select-case, 約定數據結構(數組) 就可以證明圖靈完備?
另為什麼遞歸如此重要?

TAG:編譯 | C11 |