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

時間 2021-05-31 00:54:33

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 我的理解是,乙個類...