H B*_*amy 5 c++ gcc clang intrinsics
Clang 和 GCC 定义了一堆内置函数,我将在此处使用余数示例:
__builtin_sqrt(x)
Run Code Online (Sandbox Code Playgroud)
但是,标准 C99 中定义了以下内容 math.h
sqrt(x)
Run Code Online (Sandbox Code Playgroud)
clang 为已经存在的方法定义内置函数有什么意义?我原以为常见的数学函数(例如 sqrt)会由后端优化,因此实际上并不需要内置函数。出于显而易见的原因,此内置函数的可移植性低于标准 c。
从gcc 手册:
GCC 通常会生成特殊代码来更有效地处理某些内置函数;例如,对 alloca 的调用可能成为直接调整堆栈的单个指令,而对 memcpy 的调用可能成为内联复制循环。生成的代码通常既小又快,但由于函数调用不再如此显示,您不能在这些调用上设置断点,也不能通过链接不同的库来更改函数的行为。此外,当一个函数被识别为内置函数时,GCC 可能会使用关于该函数的信息来警告调用该函数的问题,或者生成更高效的代码,即使结果代码仍然包含对该函数的调用. 例如,
库函数是编译器的外部函数,因此它不能像内置函数那样对它们进行推理。例如,编译器可能会在常量折叠中使用内置函数,例如。替换__builtin_sqrt(1)
为1
而它通常不能对 library 的调用做同样的事情sqrt(1)
。
使用内置函数不会影响可移植性,因为它们实现了标准 C,因此它们具有相同的语义。