GCC сгенерировал эквивалент сборки для оператора continue в C - PullRequest
5 голосов
/ 01 марта 2010

Когда оператор 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, я что-то упустил?

Ответы [ 2 ]

4 голосов
/ 01 марта 2010

То, что вы описываете, является оптимизацией. Конечно, если вы скажете gcc оптимизировать (достаточно -O1), он сделает именно то, что вы описываете.

1 голос
/ 01 марта 2010

Я предполагаю, что это заполнитель для некоторой последовательности исправлений с пропущенным кодом. Возможно, nop иногда заменяется инструкциями для хранения регистров в стеке или чем-то подобным.

Но чтобы получить больше доказательств этого, было бы полезно найти пример, где nop заменяется чем-то другим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...