作者Domos (没事发发废文)
看板C_and_CPP
标题Re: [闲聊] g++ 8.2.1 把 O(n) code 转成 O(1)
时间Tue Feb 19 10:17:05 2019
上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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1550542627.A.F13.html
1F:推 cutekid: ch <= '9' 会用 unsigned char 在比吗,谢谢喔 02/19 11:20
2F:推 Neisseria: 结果编译器写得比自己好 (遮脸) 02/19 18:16
3F:推 johnjohnlin: 第一个也太先进了 02/19 20:41
4F:→ adrianshum: ch<=‘9’ 应为 ch <= 9 ? 02/21 00:27
5F:推 Ryu3y3s: value range propagation 02/22 20:54