gpt4 book ai didi

c - gcc 编译器用 puts 切换 printf 调用

转载 作者:太空宇宙 更新时间:2023-11-04 01:44:16 25 4
gpt4 key购买 nike

我在我的ubuntu下编译了一个简单的C程序:

#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 调用与 puts 调用交换了。当我用 printf 尝试这个时,用一个没有附加新行的字符串调用它时,调用仍然是反汇编中对 printf 的调用。

我的问题是编译器实现这种功能的机制是什么?他是否读取要发送到 printf 的字符串,并且因为 printf 是一个 libc 函数,编译器可以决定这种优化,因为他知道 libc?

最佳答案

是的。 GCC 读取并验证格式字符串,以便发出有关错误格式字符串说明符的编译警告(例如,如果您使用 %d 但参数是 unsigned int,它打印警告。)由于它在编译时解析字符串,它还可以知道是否可以用 puts() 调用替换 printf()作为优化(puts() 更快,因为它不必解析字符串。)

关于c - gcc 编译器用 puts 切换 printf 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56741852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com