(x==0)可能比(0==x)更有效

Can (x==0) be more efficient than (0==x)?

本文关键字:有效      更新时间:2023-10-16

可能重复:
如果(flag==0)或如果(0==flag),哪个会执行得更快?

我通常把我的等式条件写为:

if(0==x)

和许多人一样,而不是

if(x==0) 

这样当我不小心键入=而不是==时,编译器就会告诉我。

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

有人知道这是否合理吗?

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

这样做没有技术上的理由。因此,不,任何称职的编译器都不会做出这种不相关的区分:因为这两个语句是严格等价的,而且编译器可以很容易地识别这一点,所以它会一视同仁。

请注意,这仅适用于内置类型和具有良好operator ==的用户定义类型理论上如果没有给出这种等价性,用户可以提供非对称operator ==过载。

谁知道"一些编译器"做什么,但总的来说,不,我不希望合理的编译器生成的代码有任何不同。

我不这么认为。编译器会将该表达式解释为比较,结果是一样的。如果编译器足够聪明,它会检测到0可以被优化。

当你有多个时,重要的是要注意比较的顺序

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

在这种情况下,应该将conditionA作为会导致if更快失败的条件,而不是让执行分析所有其他条件,然后才看到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: %dn",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 nsn", end1-start1);
    printf("0==x %d nsn", end2-start2);
}