在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, 約定數據結構(數組) 就可以證明圖靈完備?
另為什麼遞歸如此重要?