Re: [閒聊] g++ 8.2.1 把 O(n) code 轉成 O(1)

看板C_and_CPP (C/C++)作者 (沒事發發廢文)時間5年前 (2019/02/19 10:17), 編輯推噓4(401)
留言5則, 5人參與, 5年前最新討論串2/2 (看更多)
上godbolt.org玩一玩 O2開下去,compiler產生的assembly遠超乎你的想像 (注:不要用MSVC) 舉個例,寫個loop從累加1~n for(int i=1; i<=n; cnt+=i++); LLVM產生的是n(n+1)/2 再舉個例,判斷一個char是否為數字 一般我們寫isdigit(char ch) 展開後是ch >=‘0’ && ch <=‘9’ 總共兩個branch運算 新的GCC/LLVM產生的assembly則是 ch -= ‘0’ ch <= ‘9’ compiler聰明的運用溢位的特性 產生出只有一個branch的assembly 這不是什麼黑科技,compiler在好幾年前就有這樣的能力 更多例子,請上youtube找cppcon演講 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.137.137.6 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1550542627.A.F13.html

02/19 11:20, 5年前 , 1F
ch <= '9' 會用 unsigned char 在比嗎,謝謝喔
02/19 11:20, 1F

02/19 18:16, 5年前 , 2F
結果編譯器寫得比自己好 (遮臉)
02/19 18:16, 2F

02/19 20:41, 5年前 , 3F
第一個也太先進了
02/19 20:41, 3F

02/21 00:27, 5年前 , 4F
ch<=‘9’ 應為 ch <= 9 ?
02/21 00:27, 4F

02/22 20:54, 5年前 , 5F
value range propagation
02/22 20:54, 5F
文章代碼(AID): #1SQsSZyJ (C_and_CPP)
文章代碼(AID): #1SQsSZyJ (C_and_CPP)