上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演讲