在MSVC 2013中编译以下代码,64位版本构建,/O2优化:
while (*s == ' ' || *s == ',' || *s == '\r' || *s == '\n') {
++s;
}
Run Code Online (Sandbox Code Playgroud)
我得到了以下代码 - 使用64位寄存器作为带有bt(位测试)指令的查找表,它具有非常酷的优化.
mov rcx, 17596481020928 ; 0000100100002400H
npad 5
$LL82@myFunc:
movzx eax, BYTE PTR [rsi]
cmp al, 44 ; 0000002cH
ja SHORT $LN81@myFunc
movsx rax, al
bt rcx, rax
jae SHORT $LN81@myFunc
inc rsi
jmp SHORT $LL82@myFunc
$LN81@myFunc:
; code after loop...
Run Code Online (Sandbox Code Playgroud)
但我的问题是:movsx rax, al第一个分支后的目的是什么?
首先,我们从字符串中加载一个字节rax并对其进行零扩展:
movzx eax, BYTE …Run Code Online (Sandbox Code Playgroud) 我有一个类型的参数num,int用户可以给它一个两个值:0或1.
我可以用明显的方法检查它:
if (num < 0 || num > 1)
print("The parameter value is incorrect.\n");
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有更好的(更快的?更少的代码?)这样做?
编辑
这是一些数据流代码,因此性能至关重要.我正在寻找一种更快的方式来运行此检查.
谢谢