(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);
}
相关文章:
- 欧拉项目#8答案是大以获得有效答案
- 调整大小后指向元素值的指针unordered_map有效?
- 为什么是0;C++中的有效语句
- 最高有效数字侧的第N位
- GCC对可能有效的代码抛出init list生存期警告
- 有效地使用std::unordered_map来插入或增加键的值
- c++中O(n^(1/3))中一个数的除数的有效计数
- 使用无符号字符数组有效存储内存
- 自定义先决条件对移动分配运算符有效吗
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 为什么这种直接初始化有效?(C++17)
- 递归函数有效,但无法记忆
- 在C++中初始化向量映射的最有效方法
- 如果变量名称不跟在 char* 后面,const char* 是否有效?
- 钳制迭代器是否有效
- 如何有效地在 std::vector 中插入一对?
- C++模板 t 不是有效的模板类型
- 检查由括号、方括号和大括号组成的一组方括号是否有效?
- 将此布尔值传递给此函数的最有效方法是什么?