简体   繁体   中英

MSVC compiler disassembly code from if/else statement

I have a general question about how MSVC generates machine code regarding to else statement.

A simple exmaple here:

1 bool is_zero(int num) {
2    if (num)
3        return false;
4    else
5        return true;
6 }

and its disassembly code looks like

; 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

Question is: will the line jmp SHORT $LN3@is_zero (corresponding to the 4th line else keyword) get executed?

is there any good reason MSVC generates such code?

It's unoptimized code. That line 4 jmp corresponds to the jump from the if body past the else body. In this case it is never executed. Enable optimizations and it will go away.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM