来自 if/else 语句的 MSVC 编译器反汇编代码
MSVC compiler disassembly code from if/else statement
我有一个关于 MSVC 如何生成关于 else
语句的机器代码的一般性问题。
这里有一个简单的例子:
1 bool is_zero(int num) {
2 if (num)
3 return false;
4 else
5 return true;
6 }
它的disassembly code看起来像
; Listing generated by Microsoft (R) Optimizing Compiler Version 19.20.27508.1
; Function compile flags: /Odtp
num$ = 8
bool is_zero(int) PROC ; is_zero
; File C:\Users\ContainerAdministrator\AppData\Local\Temp\compiler-explorer-compiler11943-18164-1cmj5fb.ujww\example.cpp
; Line 1
mov DWORD PTR [rsp+8], ecx
; Line 2
cmp DWORD PTR num$[rsp], 0
je SHORT $LN2@is_zero
; Line 3
xor al, al
jmp SHORT $LN1@is_zero
; Line 4
jmp SHORT $LN3@is_zero
$LN2@is_zero:
; Line 5
mov al, 1
$LN3@is_zero:
$LN1@is_zero:
; Line 6
ret 0
bool is_zero(int) ENDP ; is_zero
问题是:
jmp SHORT $LN3@is_zero
行(对应第4行else
关键字)会被执行吗?
MSVC 生成这样的代码有什么充分的理由吗?
这是未优化的代码。第 4 行 jmp
对应于从 if
主体越过 else
主体的跳转。在这种情况下,它永远不会被执行。启用优化,它将消失。
我有一个关于 MSVC 如何生成关于 else
语句的机器代码的一般性问题。
这里有一个简单的例子:
1 bool is_zero(int num) {
2 if (num)
3 return false;
4 else
5 return true;
6 }
它的disassembly code看起来像
; Listing generated by Microsoft (R) Optimizing Compiler Version 19.20.27508.1
; Function compile flags: /Odtp
num$ = 8
bool is_zero(int) PROC ; is_zero
; File C:\Users\ContainerAdministrator\AppData\Local\Temp\compiler-explorer-compiler11943-18164-1cmj5fb.ujww\example.cpp
; Line 1
mov DWORD PTR [rsp+8], ecx
; Line 2
cmp DWORD PTR num$[rsp], 0
je SHORT $LN2@is_zero
; Line 3
xor al, al
jmp SHORT $LN1@is_zero
; Line 4
jmp SHORT $LN3@is_zero
$LN2@is_zero:
; Line 5
mov al, 1
$LN3@is_zero:
$LN1@is_zero:
; Line 6
ret 0
bool is_zero(int) ENDP ; is_zero
问题是:
jmp SHORT $LN3@is_zero
行(对应第4行else
关键字)会被执行吗?
MSVC 生成这样的代码有什么充分的理由吗?
这是未优化的代码。第 4 行 jmp
对应于从 if
主体越过 else
主体的跳转。在这种情况下,它永远不会被执行。启用优化,它将消失。