Clang和GCC定义了一堆内置函数我将在这里使用余数的例子:
__builtin_sqrt(x)
但是,标准C99在math.h
sqrt(x)
为已经存在的方法定义内置的clang有什么意义?我曾经认为像sqrt这样的常用数学函数会被后端优化,所以不需要内置。由于显而易见的原因,这种内置程序不如标准c便携。
答案 0 :(得分:3)
来自gcc manual:
GCC通常会生成特殊代码来处理某些内置函数 功能更有效;例如,对alloca的调用可能会变成 单个指令直接调整堆栈,并调用 memcpy可能会成为内联复制循环。结果代码通常都是 更小更快,但由于函数调用不再显示为 这样,您不能在这些调用上设置断点,也不能更改 通过链接到不同的库来执行函数的行为。在 此外,当一个功能被识别为内置功能时,GCC 可以使用有关该功能的信息来警告问题 调用该函数,或生成更高效的代码,即使 生成的代码仍包含对该函数的调用。例如, 对于printf时对printf的错误调用,使用-Wformat给出警告 内置并且strlen被称为不会修改全局内存。
库函数是编译器的外部函数,因此无法将它们推广到内置的相同范围。例如,编译器可能会使用constant folding中的内置函数,例如。将__builtin_sqrt(1)
替换为1
,而通常无法通过调用库sqrt(1)
执行相同操作。
使用builtins不会影响可移植性,因为它们实现了标准C,因此它们具有相同的语义。