1樓:原子筆
沒有測試就別隨便下結論或者杞人憂天吧。。。
編譯器在處理XX a=b時,不管XX是auto還是非auto 一樣要去檢視b的型別的,並且需要確認可以拷貝構造。所以理論上來講只會減少編譯時間,包括非自定義型別也類似。
2樓:
Premature optimization is the root of all evil
型別推導(通常)並不是個很難的事情,你更應該關心一下 template 展開的開銷。
3樓:Belleve
你去寫過 bidirectional type inference 就知道了,對於非 rec 的繫結,加型別區域性變數的宣告甚至會比不加的更慢,因為多一次 unify(以及乙個潛在的 coercion)。
bidirectional typechecker 一般長這樣
-- 你可以認為 TC 是 EitherT (StateT (List (Name * Type)) IO)。
-- StateT 處理變數繫結,EitherT 處理異常,IO 處理 Meta Type Variable 的可變繫結
Monad
TCwhere
...-- infer x : 在當前上下文中推理項 x 的型別,返回型別和修飾過的項或者異常
infer
:Term
->TC(
Type
*Term
)-- check x t : 在當前上下文中檢查項 x 的型別是否為 t,返回修飾過的項或者異常
check
:Term
->Type
->TCTerm
-- 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)
4樓:劉項
在auto出現之前,
C++需要先推導等號右側表示式的型別,
然後檢查它與變數的型別是否可以轉換(例如相容轉換、向下型別轉換和自定義型別轉換)。
在auto出現之後,
C++在推導出等號右側表示式的型別之後,
直接指定給變數。
檢查的過程變成了指定的過程,時間上可以認為差別不大。
c 11中 auto 定義的引用為什麼不能繫結字面值?
劉雲賓 編譯器認為,8 的型別是 int 因為非類非陣列的純右值沒有 CV 屬性 所以,它會推導為 int ay 8 這顯然是錯誤的。非類非陣列的純右值不能有cv 限定。注意 函式呼叫或轉型表示式可能生成非類的 cv 限定型別的純右值,但其 cv 限定符被立即剝除。值類別 cppreference....
C 中,async關鍵字到底起什麼作用?
小墨 async 就把他當成乙個非同步的標誌就好啦。就當做和void 一樣。await 等待非同步 但也可以使用xx.result 獲取 await之後的結果。 pokemon 高階篇 以IL為劍,直指async await 布魯克石 CSDN部落格 可以看看這個,async await 是語法糖,...
C 中mutable關鍵字存在的必要性是什麼?
千月 const宣告是告訴使用者此操作不會改變物件狀態,類似於一種保證。當一些變數不屬於物件狀態時,我們應該也要允許它在const函式中發生改變。舉個簡單的例子,我想統計某個物件介面被呼叫的次數,使用者應該不想const函式被排除吧,mutable不就派上用場了。 YiQiuuu 我的理解是,乙個類...