Clang和GCC定义了一堆内建函数,我将在此处使用remainder作为示例:
__builtin_sqrt(x)
然而,标准C99在
math.h
中定义了以下内容。sqrt(x)
clang为什么要定义一个已经存在的方法的内置函数呢?我认为像sqrt这样的常见数学函数应该由后端进行优化,因此不需要内置函数。这些内置函数比标准c更不可移植,原因显而易见。
Clang和GCC定义了一堆内建函数,我将在此处使用remainder作为示例:
__builtin_sqrt(x)
math.h
中定义了以下内容。sqrt(x)
来自gcc手册:
GCC通常会生成特殊的代码以更高效地处理某些内置函数;例如,对于alloca的调用可能会变成直接调整堆栈的单个指令,而对于memcpy的调用可能会变成内联复制循环。生成的代码通常既更小又更快,但由于函数调用不再像原来那样出现,因此您无法在这些调用上设置断点,也无法通过链接到不同的库来更改函数的行为。此外,当一个函数被识别为内置函数时,GCC可以使用关于该函数的信息来警告有关对该函数的调用存在问题的情况,或者生成更高效的代码,即使生成的代码仍然包含对该函数的调用。例如,在printf内置且strlen已知不修改全局内存时,使用-Wformat会给出有关对printf的错误调用的警告。
库函数是编译器外部的,因此它不能像内建函数那样对它们进行推理。例如,编译器可以在常量折叠中使用内建函数,例如用1
替换__builtin_sqrt(1)
,但通常无法对调用库函数sqrt(1)
进行相同的操作。
使用内建函数不会影响可移植性,因为它们实现了标准C,所以具有相同的语义。
__builtin_sqrt
替换了它。 - el.pescado - нет войне
#ifdef
来获取编译器特定的内置函数?如果不是,为什么不呢? - SO_fix_the_vote_sorting_bug