使用clang内置与标准功能的好处

时间:2017-03-08 09:20:44

标签: c++ gcc clang intrinsics

Clang和GCC定义了一堆内置函数我将在这里使用余数的例子:

__builtin_sqrt(x)

但是,标准C99在math.h

中定义了以下内容
sqrt(x)

为已经存在的方法定义内置的clang有什么意义?我曾经认为像sqrt这样的常用数学函数会被后端优化,所以不需要内置。由于显而易见的原因,这种内置程序不如标准c便携。

1 个答案:

答案 0 :(得分:3)

来自gcc manual

  

GCC通常会生成特殊代码来处理某些内置函数   功能更有效;例如,对alloca的调用可能会变成   单个指令直接调整堆栈,并调用   memcpy可能会成为内联复制循环。结果代码通常都是   更小更快,但由于函数调用不再显示为   这样,您不能在这些调用上设置断点,也不能更改   通过链接到不同的库来执行函数的行为。在   此外,当一个功能被识别为内置功能时,GCC   可以使用有关该功能的信息来警告问题   调用该函数,或生成更高效的代码,即使   生成的代码仍包含对该函数的调用。例如,   对于printf时对printf的错误调用,使用-Wformat给出警告   内置并且strlen被称为不会修改全局内存。

库函数是编译器的外部函数,因此无法将它们推广到内置的相同范围。例如,编译器可能会使用constant folding中的内置函数,例如。将__builtin_sqrt(1)替换为1,而通常无法通过调用库sqrt(1)执行相同操作。

使用builtins不会影响可移植性,因为它们实现了标准C,因此它们具有相同的语义。