Re: [閒聊] g++ 8.2.1 把 O(n) code 轉成 O(1)
上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
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
02/21 00:27, 4F
推
02/22 20:54,
5年前
, 5F
02/22 20:54, 5F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章