我最近写了一个对数组排序的程序。为此,我需要编写一个比较函数,并将其传递给它。我的比较函数应该返回1(如果x> y),-1(如果x <y)或0(如果x = y)。我使用条件表达式编写了一个正则函数(功能1),但建议我编写不同的内容(功能2)。这样写更好吗?布尔条件是否会始终为真返回1?(我的意思是,如果x = 0和y = 0,我们将总是(x == y)== 1吗?)
功能一:
int Icmp(void* x, void* y)
{
int a = *(int*)x;
int b = *(int*)y;
if (a > b)
return 1;
else if (a < b)
return -1;
else
return 0;
}
功能2:
int Icmp(void* x, void* y)
{
return (*(int*)x > * (int*)y) - (*(int*)x < *(int*)y);
}
编写非分支代码的首选方法是对操作数使用局部变量:
int icmp(const void *x, const void *y)
{
int a = *(const int *)x;
int b = *(const int *)y;
return (a > b) - (a < b);
}
该表达式是比较函数中的一个常见习语,如果使用变量而不是就地指针取消引用来编写,则该表达式也很易读。
该代码依赖于以下事实:使用>
,<
或什至为1或0==
的类型的比较结果。int
这是C标准所必需的-根据定义,生成诸如42或-1之类的值的任何编译器都不是C编译器。
很容易看到最大。中的一个a > b
或a < b
能够在给定时间是真实的,并且结果是任一1 - 0
,0 - 1
或0 - 0
。
关于无分支代码的原因-尽管编译器可能会为两个函数生成完全相同的代码,但它们通常不会。例如,最新的GCC和ICC似乎都为x86-64上的第一个功能生成了一个分支,但为后者有条件执行的无分支代码。对于任何说分支无关紧要的人,那么我将向您介绍Stack Overflow上投票最高的QA。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句