Почему циклы всегда компилируются в стиле «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);

Я не вижу значительного повышения производительности или читабельности кода, так почему же это часто так? Есть ли название для этого стиля цикла, например, «проверка условий в конце»?

Ответы на вопрос(1)

Ваш ответ на вопрос