1

例子:

ulong a = // some value
if(a == 0)
  // do something

执行测试时,如果a == 0值 0 必须从其默认值转换为 ulong。这种转换需要很多时间吗?

测试时会花费更少的时间a == 0UL吗?

我正在做一个时间紧迫的项目,所以每次操作少就是好的。

4

2 回答 2

5

长话短说,与较小位宽的恒定值进行比较没有运行时影响。

长话短说:

当您与常量进行比较时,编译器将在编译时扩大常量,因此不会对运行时产生影响。您不必显式指定常量大小,因为编译器足够聪明,可以找出要使用的正确大小。double将 a与浮点常数进行比较也是如此。

当您与变量进行比较时,编译器会生成代码以在运行时扩大值。根据所涉及的类型和平台(例如 32 位平台上的 64 位类型),这可能会消耗几个周期。一般来说,虽然操作相当快。

例如,将一个有符号的 32 位整数变量从堆栈加载到一个无符号的 64 位寄存器是 x64 平台上的一条指令:

movsx rax, dword ptr[rsp+<offset>]

在 x86 平台上,通过两个 32 位寄存器加载和符号扩展值需要更多操作以及一些杂耍……这并不奇怪。

于 2013-08-22T22:05:07.613 回答
3

没什么区别。它们是完全相同的操作(显然在所有情况下结果都相同)并且任何编译器都太愚蠢以至于无法意识到任何理智的人都不会使用的编译器。

于 2013-08-22T21:19:08.777 回答