函数 Odd(x) 和 ((x Mod 2) <> 0) 之间有区别吗
Is there a difference between the function Odd(x) and ((x Mod 2) <> 0)
Delphi(实际上是 Pascal)具有函数 Odd(x: integer): boolean which returns true,如果参数不能被 2 整除,false 如果是:
if Odd(x) then
WriteLn('Argument is odd.')
else
WriteLn('Argument is even.')
或者可以使用 mod 运算符:
if (x mod 2) <> 0 then
WriteLn('Argument is odd.')
else
WriteLn('Argument is even.')
性能上有什么不同吗?我希望编译器为系统函数生成优化代码。
我对有关 Delphi 2007 的答案特别感兴趣,但如果有人也可以检查其他 Delphi 版本,那就太好了。
Odd 使用 test
指令生成最好的代码(检查最低位),其中 1 后跟零跳转。从 Turbo Pascal 开始就是这样。
生成相同代码的另一种方法是
if x and 1 <> 0 then
但是当您可以使用 Odd
.
以更简洁的方式编写代码时,您为什么要编写这样的代码?
反正奇数最好;
至于x mod 2
检查,性能取决于x
是有符号整数还是无符号整数;为无符号类型生成的代码更有效。
Delphi XE编译器:
奇数(x):
Project11.dpr.10: if Odd(x) then
0040F327 F645FC01 test byte ptr [ebp-],
0040F32B 741B jz [=10=]40f348
x mod 2,无符号 x
(长字):
Project11.dpr.14: if (x mod 2) <> 0 then
0040F431 8B45FC mov eax,[ebp-]
0040F434 83E001 and eax,
0040F437 85C0 test eax,eax
0040F439 741B jz [=11=]40f456
x mod 2, 有符号 x
(longint):
Project11.dpr.14: if (x mod 2) <> 0 then
0040F361 8B45FC mov eax,[ebp-]
0040F364 2501000080 and eax,000001
0040F369 7905 jns [=12=]40f370
0040F36B 48 dec eax
0040F36C 83C8FE or eax,-
0040F36F 40 inc eax
0040F370 85C0 test eax,eax
0040F372 741B jz [=12=]40f38f
Delphi(实际上是 Pascal)具有函数 Odd(x: integer): boolean which returns true,如果参数不能被 2 整除,false 如果是:
if Odd(x) then
WriteLn('Argument is odd.')
else
WriteLn('Argument is even.')
或者可以使用 mod 运算符:
if (x mod 2) <> 0 then
WriteLn('Argument is odd.')
else
WriteLn('Argument is even.')
性能上有什么不同吗?我希望编译器为系统函数生成优化代码。
我对有关 Delphi 2007 的答案特别感兴趣,但如果有人也可以检查其他 Delphi 版本,那就太好了。
Odd 使用 test
指令生成最好的代码(检查最低位),其中 1 后跟零跳转。从 Turbo Pascal 开始就是这样。
生成相同代码的另一种方法是
if x and 1 <> 0 then
但是当您可以使用 Odd
.
反正奇数最好;
至于x mod 2
检查,性能取决于x
是有符号整数还是无符号整数;为无符号类型生成的代码更有效。
Delphi XE编译器:
奇数(x):
Project11.dpr.10: if Odd(x) then
0040F327 F645FC01 test byte ptr [ebp-],
0040F32B 741B jz [=10=]40f348
x mod 2,无符号 x
(长字):
Project11.dpr.14: if (x mod 2) <> 0 then
0040F431 8B45FC mov eax,[ebp-]
0040F434 83E001 and eax,
0040F437 85C0 test eax,eax
0040F439 741B jz [=11=]40f456
x mod 2, 有符号 x
(longint):
Project11.dpr.14: if (x mod 2) <> 0 then
0040F361 8B45FC mov eax,[ebp-]
0040F364 2501000080 and eax,000001
0040F369 7905 jns [=12=]40f370
0040F36B 48 dec eax
0040F36C 83C8FE or eax,-
0040F36F 40 inc eax
0040F370 85C0 test eax,eax
0040F372 741B jz [=12=]40f38f