Код разборки компилятора MSVC из оператора if / else - PullRequest
1 голос
/ 03 мая 2019

У меня есть общий вопрос о том, как MSVC генерирует машинный код для оператора else.

Простой пример здесь:

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

и код разборки похоже

; 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 Ответ

4 голосов
/ 03 мая 2019

Это неоптимизированный код.Эта строка 4 jmp соответствует прыжку с тела if после тела else.В этом случае это никогда не выполняется.Включите оптимизацию, и она исчезнет.

...