Когда оператор continue используется внутри цикла в C-коде, GCC создает новую метку с инструкцией nop непосредственно перед концом блока цикла и переходит к нему, а не к концу самого блока цикла. Например, следующий код C
for (i=0; i<10; i++) {
puts("blah\n");
if (i < 10) continue;
puts("This shouldn't be printed.\n");
}
производит следующий эквивалент ASM (с использованием gcc -S):
movl $0, 28(%esp)
jmp L2
L5:
movl $LC0, (%esp)
call _puts
cmpl $9, 28(%esp)
jle L7
L3:
movl $LC1, (%esp)
call _puts
jmp L4
L7:
nop
L4:
incl 28(%esp)
L2:
cmpl $9, 28(%esp)
jle L5
(часть if (i <10) вставлена, чтобы компилятор не «оптимизировал» раздел, удаляя все, что следует за оператором continue) </p>
Мой вопрос: почему бы не перейти прямо к L4? ИМО, мы могли бы также перейти на L4, я что-то упустил?