我注意到GCC非常聪明地优化 printf
. 例如, printf("")
已从生成的代码中完全删除 . printf("\n")
替换为 putchar('\n')
.
我注意到当我编译一个非常小的模块时:
extern "C" int printf(const char *__restrict __format, ...);
void f()
{
printf("\n");
}
使用 gcc -O2
printf
的调用被替换为 putchar('\n')
(甚至不需要包含任何头文件) .
生成的代码:
f():
mov edi, 10
jmp putchar
允许执行这些优化的机制是什么?据我所知,标准C不提供任何允许这种优化的功能 .
它可以扩展为用户功能还是在编译器中“硬编码”?
这也意味着如果我想用自己的实现重新定义 printf
,编译器可能会搞砸它 . 这是真的吗?
1 回答
使用GCC进行编译时,某些功能是内置功能 . 这意味着它们的实现内置于编译器中,并且库版本被忽略 .
printf
就是这样一个功能 .看看http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html