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

作者: Domos (沒事發發廢文)   2019-02-19 10:17:05
上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演講
作者: cutekid (可愛小孩子)   2019-02-19 11:20:00
ch <= '9' 會用 unsigned char 在比嗎,謝謝喔
作者: Neisseria (Neisseria)   2019-02-19 18:16:00
結果編譯器寫得比自己好 (遮臉)
作者: johnjohnlin (嗯?)   2019-02-19 20:41:00
第一個也太先進了
作者: adrianshum (Alien)   2019-02-21 00:27:00
ch<=‘9’ 應為 ch <= 9 ?
作者: Ryu3y3s (3y3s)   2019-02-22 20:54:00
value range propagation

Links booklink

Contact Us: admin [ a t ] ucptt.com