Can(x == 0)比(0 == x)更有效吗?

时间:2011-05-26 21:20:30

标签: c++

  

可能重复:
  Which one will execute faster, if(flag==0) or if(0==flag)?

我通常把我的平等条件写成:

if(0==x)
很多人都这样做,而不是

if(x==0) 

这样编译器就会在我意外输入=而不是==时告诉我。

有人告诉我,有些编译器将其实现为两个寄存器加载,而不是使用不等于零的操作,因此效率较低。

任何人都知道这是否是一个合理的评论?

5 个答案:

答案 0 :(得分:8)

  

有人告诉我,有些编译器将其实现为两个寄存器加载,而不是使用不等于零的操作

没有技术理由这样做。所以不,任何有价值的编译器都会产生这种无关的区别:因为两个语句都是严格等同的,并且由于编译器可以轻易地识别它们,所以它会对它们进行相同的处理。

请注意,对于内置类型和行为良好operator ==的用户定义类型,为true。 理论上用户可以提供非对称operator ==重载,而不会给出这种等价。

答案 1 :(得分:4)

谁知道“某些编译器”的作用,但总的来说,不,我不希望合理编译器生成的代码有任何差别。

答案 2 :(得分:0)

我不这么认为。编译器会将该表达式解释为比较,效果将相同。如果编译器足够智能,它将检测到0可以被优化。

当您有多个比较时,重要的是比较顺序:

if(conditionA && conditionB && (conditionC || conditionD)) {...}

在这种情况下,您应该将conditionA作为导致if更快失败的条件,而不是让执行分析所有其他条件,然后才会看到条件A失败。

答案 3 :(得分:0)

尝试编写下面的小程序,然后根据需要确定哪些程序。您在寻找小代码或快速执行吗?

#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;
    }

答案 4 :(得分:0)

为什么不尝试对2种解决方案进行基准测试? :

#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);
}