留下点回忆
分支是什么,具体可以参见:http://blog.csdn.net/housisong/archive/2007/10/05/1812117.aspx
这里举一个实际的例子来说明如何删除分支。
代码如下:
上面的代码有两个分支;一个是用来判断val的值是否大于0,另外一个是判断val是否比被除数小。
对于第一个判断的目的就是要在val小于0的时候将其转换为正值,然后进行除法运算,最终还要将符号取反。因此对于val为正和负的不同在于运算前后的符号取反。
为了消除这个分支需要定义一个数组,这个数组包含两个元素;一个元素保存正val的绝对值,另外一个保存绝对值的负值,修改后的代码如下:
先要定义一个数组,然后在开始的时候给这个数组赋值,进行除法以后,同样将结果赋值数组,在对数组取值的时候使用val<0作为索引来查找。上面的程序与前面的程序是等价的。但它却消除了分支,从而让CPU能更好的预测。
其实对于除法的也是一个分支,在开始的时候我试图也消除这个分支,但结果事与愿为,我的转换确实消除了分支,带来的确实无能如何都要执行一次整数除法。例如:
posted on 2008-09-29 00:00 笨笨 阅读(1843) 评论(0) 编辑 收藏 引用 所属分类: 代码优化
Powered by: C++博客 Copyright © 笨笨