示例:
ulong a = // some value
if(a == 0)
// do something
如果a == 0
执行测试,则必须将值0从其默认值转换为ulong。这种转换需要花费很多时间吗?
测试a == 0UL
会花费更少的时间吗?
我正在开展一个时间紧迫的项目,所以每次操作都不错。
答案 0 :(得分:5)
长话短说,比较对较小位宽的常量值没有运行时影响。
这是长篇故事:
当你与常量进行比较时,编译器会在编译时加宽常量,因此不会产生运行时影响。您不必显式指定常量大小,因为编译器足够聪明,可以确定要使用的正确大小。将double
与浮点常数进行比较也是如此。
当您与变量进行比较时,编译器会生成代码以在运行时扩展该值。根据所涉及的类型和平台(例如,32位平台上的64位类型),这可能会消耗几个周期。一般来说,操作相当快。
例如,将带有符号的32位整数变量从堆栈加载到无符号的64位寄存器是x64平台上的单条指令:
movsx rax, dword ptr[rsp+<offset>]
在x86平台上,需要更多操作才能通过两个32位寄存器加载和签名扩展值,并且有点杂乱......没有意外。
答案 1 :(得分:3)
没有区别。它们是完全相同的操作(在所有情况下显然都是相同的结果)并且任何编译器都太愚蠢而无法实现任何理智的人都不会使用的编译器。