Почему циклы всегда компилируются в стиле «do… while» (прыжок с хвоста)?
Когда я пытаюсь понять сборку (с включенной оптимизацией компилятора), я вижу это поведение:
Очень простой цикл, подобный этому
outside_loop;
while (condition) {
statements;
}
Часто компилируется в (псевдокод)
; outside_loop
jmp loop_condition ; unconditional
loop_start:
loop_statements
loop_condition:
condition_check
jmp_if_true loop_start
; outside_loop
Однако, если оптимизация не включена, она компилируется в обычно понятный код:
loop_condition:
condition_check
jmp_if_false loop_end
loop_statements
jmp loop_condition ; unconditional
loop_end:
Согласно моему пониманию, скомпилированный код лучше выглядит следующим образом:
goto condition;
do {
statements;
condition:
}
while (condition_check);
Я не вижу значительного повышения производительности или читабельности кода, так почему же это часто так? Есть ли название для этого стиля цикла, например, «проверка условий в конце»?