GCC 9.2.0 лучше чем 10.3.0?

Рассмотрим простую программу argc.c которая выводит количество аргументов

#include <stdio.h>

int main(int argc,char* argv[])
{
    printf("%d\n",argc);
    return 0;
}

С помощью gcc версии 9.0.2 переведем текст в ассемблер

gcc -Ofast -S argc.c -o argc.s

    .data
LC0:
    .ascii "%d\12\0"
    .text
    .globl  _main
_main:
    pushl   %ebp
    movl    %esp, %ebp
    andl    $-16, %esp
    subl    $16, %esp
    movl    8(%ebp), %eax
    movl    $LC0, (%esp)
    movl    %eax, 4(%esp)
    call    _printf
    xorl    %eax, %eax
    leave
    ret

Если взять gcc версии 10.3.0 то текст на ассемблере выглядит так

.data
LC0:
    .ascii "%d\12\0"
    .text
_printf:
    pushl   %ebx
    subl    $24, %esp
    leal    36(%esp), %ebx
    movl    $1, (%esp)
    call    *__imp____acrt_iob_func
    movl    %ebx, 8(%esp)
    movl    $LC0, 4(%esp)
    movl    %eax, (%esp)
    call    ___mingw_vfprintf
    addl    $24, %esp
    popl    %ebx
    ret
    .globl  _main
_main:
    pushl   %ebp
    movl    %esp, %ebp
    andl    $-16, %esp
    subl    $16, %esp
    movl    8(%ebp), %eax
    movl    $LC0, (%esp)
    movl    %eax, 4(%esp)
    call    _printf
    xorl    %eax, %eax
    leave
    ret

Заметно что при вызове printf программа делает переход на метку printf: и выполняет подготовительные работы.Отображением на экране теперь занимается функция vfprintf. Чем обусловлено такое не оптимизированное поведение компилятора? Чем плоха функция printf в версии 10.3.0 ?


Ответы (2 шт):

Автор решения: eri

Похоже printf заменили на инлайн и компилятор полностью перенес её в ассемблер.

→ Ссылка
Автор решения: Space Researcher

Давайте по порядку:\

  1. Что значит лучше?
  2. eri правильно указал, printf заменили на инлайн, скорее всего это действительно так(по крайней мере звучит логично)
  3. укажите параметр O цифрой, как написано в доке, сравните на разных уровнях оптимизации. Вполне вероятно, что с этим тоже может быть связано.
  4. Даже если вы проверили все вышеперечисленные пункты и 10 версия работает так же, то это вообще не значит что она хуже, а 9 лучше. Но и обратного тоже не значит. Это просто значит, что он работает по другому. То, что в ассемблерном коде больше команд, ни о чём не говорит, даже с точки зрения скорости выполнения(а я так понял, вы обращаете внимание именно на это).
  5. Данная особенность вообще никак не повлияет на скорость работы программы на современных машинах
→ Ссылка