C++ 代码优化
0x00 C++代码优化
在这里讲述一些代码优化的奇技淫巧:
0x00 位运算
位运算往往比普通的加减乘除运算快很多,例如:
可以写为a >> b
,可以写为a << b
可以写为a & 2^b -1
,例如10与4取余即为10 & 3
计算int类型a与b的平均值,如果使用表达式可能会出现a+b溢出的情况,但a+b的平均值只能小于等于max(a, b),也就说绝不会溢出,此处可以使用位运算做一个不会溢出的平均值计算:
1 | (a&b)+((a^b)>>1) |
不使用临时变量互换两个整数:
1 | x ^= y; |
0x01 减少运算强度
当计算时,如果b比较小的话可以直接写成a*a*a
的形式避免使用pow
函数
使用自增自减运算符来代替诸如i = i + 1
这样的运算,i = i + 1
往往生成如下汇编代码:
1 | move A,i ; 把x从存储器取出存入累加器A |
如果使用++i
的话,对于大多数CPU来说就只有一行汇编指令了:
1 | incr i ; i加1 |
同样,尽量使用++i
而不是i++
,此处对于迭代器来说同样适用,因为i++
往往伴随着多余的存指令和取指令,此处可以对比STL中迭代器重载的前置自增和后置自增运算符代码:
1 | _Vector_iterator& operator++() |
使用复合表达式,例如将a = a + b
改为a += b
,这个也是老生常谈了
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Shaoqun Liu's Blog!