Я скомпилировал простую программу на 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?