你可能会看到不断折叠 https://en.wikipedia.org/wiki/Constant_folding在这里,在数学函数调用中使用常量将导致编译器计算该函数并忽略对数学库的调用。
如果我们查看文档GCC提供的其他内置函数 http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html#Other-Builtins says(强调我的):
GCC 包含标准 C 库中许多函数的内置版本。以 _ 为前缀的版本builtin即使您指定了 -fno-builtin 选项,它们也始终被视为与 C 库函数具有相同的含义。 (请参阅 C 方言选项)其中许多函数仅在某些情况下进行优化;如果它们在特定情况下未优化,则会发出对库函数的调用。
如果我们看看这个稍微修改一下实例 http://coliru.stacked-crooked.com/a/32d13721bb731192它使用以下代码:
#include <stdio.h>
#include <math.h>
int main(void)
{
printf("%d\n",(int)sqrt(25));
return 0;
}
我们看到以下生成的程序集gcc
:
movl $5, %esi
movq %rax, %rdi
movl $0, %eax
call printf
所以我们看到5
被移入esi
其中在x64 abi http://x86-64.org/documentation/abi.pdf是调用函数的第二个参数,是以下结果sqrt(25)
没有电话sqrt
at all.
请注意您缺少:
#include <math.h>
Update
内置是一个海湾合作委员会扩展 http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html#C-Extensions上面的内置链接解释了哪些函数在哪种模式下使用,并且它们都应该与标准函数具有相同的含义。
如果您担心您的代码是否符合标准,那么您可以查看控制 C 方言的选项 http://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#C-Dialect-Options手册的部分。您可以使用-std
指定您想要遵守的标准以及-pedantic
当您使用不符合标准或不符合标准的功能时启用警告-pedantic-errors
使警告成为错误。例如使用
gcc -std=c99 -pedantic
当您使用符合以下要求的功能时,会生成警告C99标准例如零长度数组 http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html#Zero-Length.
我们还可以使用-fno-builtin
要禁用一些内置函数,文档说:
无法识别不以 _ 开头的内置函数builtin作为前缀。有关受影响函数的详细信息,请参阅 GCC 提供的其他内置函数,包括那些在使用严格 ISO C 一致性的 -ansi 或 -std 选项时非内置函数的函数,因为它们不具有 ISO 标准含义。 [...]