条件分支与条件传送问题
2019-10-27 本文已影响0人
ProgrammingGuy
// return absdiff;
int ct(int x, int y)
{
int lval = x - y;
int rval = y - x;
if (x > y)
{
rval = lval;
}
return rval;
}
int cb(int x, int y)
{
if (x > y)
{
goto t;
}
goto d;
t:
return x - y;
d:
return y - x;
}
long cread(long* xp)
{
return (xp ? *xp : 0);
}
ct
为条件传送示例,cb
为条件分支示例。条件传送是先计算出该返回的两个值,然后根据条件来返回其中一个,因为有流水线的优势,所以这个方法在现代计算机中可以获得性能优势。条件分支为传统方式,根据测试条件来执行跳转,性能相对弱,特别是预测分支失败之后,需要很多时钟周期回到正确的分支。
cread
示例说明了条件传送不适用的地方,如果xp
是空指针,在条件传送流程中会对空指针取值,就引发了空指针引用问题。