MSVC编译器从if / else语句反汇编代码

时间:2019-05-03 17:28:45

标签: c++ visual-c++ compiler-construction disassembly

关于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是否有充分的理由生成此类代码?

1 个答案:

答案 0 :(得分:4)

这是未优化的代码。第4行jmp对应于从if主体到else主体的跳转。在这种情况下,它永远不会执行。启用优化,它将消失。