如果 (n!=0) n=0; v/sn=0;哪个更有效,为什么?
if (n!=0) n=0; v/s n=0; Which is more efficient and why?
作为高级程序员输入程序时,n = 0;
看起来更高效、更干净。
但是 n = 0;
真的比 if (n != 0) n = 0;
更有效率吗?
当 n
更可能是 0
。
当 n
不太可能是 0
。
当n
绝对不确定。
语言:C (C90)
编译器:Borland 的 Turbo C++
最少的可重现代码
void scanf();
void main()
{
int n; // 2 bytes
n=0; // Expression 1
scanf("%d",&n); // Absolutely uncertain
if(n!=0) n=0; // Expression 2
}
注意:以上代码仅供大家参考。请不要随波逐流
如果您对上述 language/standard/compiler 感到不满意,请随时在您的首选 language/standard/compiler.
中解释以上 3 种情况
n = 0;
因为没有条件检查,所以效率会更高。
如果n
是2的补码整数类型或者无符号整数类型,那么直接写n = 0
肯定不会比带条件检查的版本慢,好的优化编译器会生成相同的代码。一些编译器将赋值编译为零作为寄存器值与自身的异或运算,这是一条指令。
如果n
是浮点类型、1s的补码整数类型或带符号的幅度整数类型,则这两个代码片段的行为不同。例如。例如,如果 n
有符号负零。 (确认@chqrlie。)此外,如果 n
是系统上的指针,而不是具有多个空指针表示形式,则 if (n != 0) n = 0;
不会分配 n
,而 n
是其中之一各种 空指针 。 n = 0;
赋予不同的功能。
"will always be more efficient" 不正确。如果读 n
成本低,写 n
成本高(想想重写非易失性存储器需要重写一个页面)并且很可能 n == 0
,那么n = 0;
比 if (n != 0) n = 0;
.
慢, 效率低
作为高级程序员输入程序时,n = 0;
看起来更高效、更干净。
但是 n = 0;
真的比 if (n != 0) n = 0;
更有效率吗?
当
n
更可能是0
。当
n
不太可能是0
。当
n
绝对不确定。
语言:C (C90)
编译器:Borland 的 Turbo C++
最少的可重现代码
void scanf();
void main()
{
int n; // 2 bytes
n=0; // Expression 1
scanf("%d",&n); // Absolutely uncertain
if(n!=0) n=0; // Expression 2
}
注意:以上代码仅供大家参考。请不要随波逐流
如果您对上述 language/standard/compiler 感到不满意,请随时在您的首选 language/standard/compiler.
中解释以上 3 种情况n = 0;
因为没有条件检查,所以效率会更高。
如果n
是2的补码整数类型或者无符号整数类型,那么直接写n = 0
肯定不会比带条件检查的版本慢,好的优化编译器会生成相同的代码。一些编译器将赋值编译为零作为寄存器值与自身的异或运算,这是一条指令。
如果n
是浮点类型、1s的补码整数类型或带符号的幅度整数类型,则这两个代码片段的行为不同。例如。例如,如果 n
有符号负零。 (确认@chqrlie。)此外,如果 n
是系统上的指针,而不是具有多个空指针表示形式,则 if (n != 0) n = 0;
不会分配 n
,而 n
是其中之一各种 空指针 。 n = 0;
赋予不同的功能。
"will always be more efficient" 不正确。如果读 n
成本低,写 n
成本高(想想重写非易失性存储器需要重写一个页面)并且很可能 n == 0
,那么n = 0;
比 if (n != 0) n = 0;
.