如何解决x == 0是否比0 == x更有效? [重复]
| 这个问题已经在这里有了答案:解决方法
有人告诉我,某些编译器将其实现为两个寄存器加载,而不是使用不等于零的操作进行加载
没有技术原因可以这样做。因此,不会,任何值得赞扬的编译器都不会做出这种无关紧要的区分:由于这两个语句严格相等,并且由于编译器可以轻松识别这一点,因此将对它们进行相同处理。
请注意,这仅适用于行为良好的“ 0”的内置类型和用户定义类型。从理论上讲,用户可以提供不等价的不对称“ 0”重载。
,谁知道“某些编译器”的作用,但是总的来说,不,我不希望合理的编译器生成的代码有任何区别。
,我不这么认为。编译器将把该表达式解释为比较,并且效果将相同。如果编译器足够聪明,它将检测到可以优化
0
。
重要的是要比较的顺序是多个时的比较顺序:
if(conditionA && conditionB && (conditionC || conditionD)) {...}
在这种情况下,应将conditionA设置为会导致ѭ4更快失败的条件,而不是让执行过程分析所有其他条件,然后才看到conditionA失败。
,尝试编写一些小型程序,例如下面的程序,您可以确定哪种程序适合您的需求。您是否正在寻找较小的代码量或快速执行?
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
int x = atoi(argv[1]);
int zeros=0;
int i;
for (i=0; i<100000; i++) {
if (0==x) {
zeros++;
}
}
printf(\"zeros: %d\\n\",zeros);
return 0;
}
,为什么不尝试对这两种解决方案进行基准测试? :
#include <stdio.h>
#include <time.h>
#define LOOPS 1000000000
void main(void)
{
clock_t start1,start2,end1,end2;
int x=1,i;
start1=clock();
for(i=0;i<LOOPS;i++)
{
if (x==0)
{
x=1;
}
}
end1=clock();
start2=clock();
for(i=0;i<LOOPS;i++)
{
if (0==x)
{
x=1;
}
}
end2=clock();
printf(\"x==0 %d ns\\n\",end1-start1);
printf(\"0==x %d ns\\n\",end2-start2);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。