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