переключатель компилятора gcc вызов printf с путами - PullRequest
1 голос
/ 24 июня 2019

Я скомпилировал простую программу на C под своей Ubuntu:

#include<stdio.h>

int main()
{
        printf("hello world\n");
        return 0;
}

, затем я проверил дизассемблирование исполняемого файла, используя gdb, и увидел следующий код:

   0x000000000000063a <+0>:     push   %rbp
   0x000000000000063b <+1>:     mov    %rsp,%rbp
   0x000000000000063e <+4>:     lea    0x9f(%rip),%rdi        # 0x6e4
   0x0000000000000645 <+11>:    callq  0x510 <puts@plt>
   0x000000000000064a <+16>:    mov    $0x0,%eax
   0x000000000000064f <+21>:    pop    %rbp
   0x0000000000000650 <+22>:    retq

ЗдесьКомпилятор только что поменял вызов printf с помощью метода putКогда я попытался сделать это с помощью printf, вызвав его со строкой, к которой не добавлена ​​новая строка, вызов остался вызовом printf в дизассемблере.

Мой вопрос заключается в том, каков механизм компиляторачто позволяет такую ​​вещь?Читает ли он строку, которая будет отправлена ​​в printf, и поскольку printf является функцией libc, компилятор может решить эту оптимизацию, поскольку он знает libc?

Ответы [ 2 ]

3 голосов
/ 24 июня 2019

Да. GCC читает и проверяет строку формата для выдачи предупреждений компиляции о неверном спецификаторе строки формата (например, если вы используете %d, но аргумент равен unsigned int, он печатает предупреждение.) Поскольку он анализирует строку при компиляции время может также знать, возможно ли заменить printf() на вызов puts() в качестве оптимизации (puts() быстрее, потому что не нужно анализировать строку.)

2 голосов
/ 24 июня 2019

Некоторые функции «лучше известны» компилятору, потому что они используются наиболее часто.printf одна из таких функций.Компилятор даже анализирует строку формата и предупреждает, если параметры имеют неправильные типы.Вы также можете использовать эту функцию, когда пишете похожие функции, позволяя (посредством атрибутов apriopriate) компилятору, чтобы ваши функции использовали строку формата стиля printf.А поскольку он знает, как работает эта функция, он может оптимизировать обращения к ней.Есть много других функций, подобных этой.Например memcpy семейные, много математики и т. Д. И т. Д.

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