【问题标题】:Benefits of using clang builtins vs standard functions使用 clang 内置函数与标准函数的好处
【发布时间】:2017-07-28 18:51:07
【问题描述】:

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

__builtin_sqrt(x)

但是,标准 C99 在 math.h 中定义了以下内容

sqrt(x)

clang 为已经存在的方法定义内置函数有什么意义?我原以为像 sqrt 这样的常见数学函数会被后端优化,所以实际上并不需要内置函数。由于显而易见的原因,此内置函数的可移植性不如标准 c。

【问题讨论】:

  • 你不应该直接使用 __builtin_sqrt。您应该使用 sqrt。编译器将识别出 sqrt 是它知道的函数并将其替换为 __builtin_sqrt。在实现这一点时,gcc 没有内部函数的概念,它只有内置函数,用户可以使用,所以 __builtin_sqrt 最终在用户代码中工作,但这是一个历史事故。
  • @MarcGlisse 为什么不直接使用呢?甚至没有#ifdefs 来获得编译器特定的内置函数?如果没有,为什么不呢?
  • @jdk1.0 为什么在标准代码等效的情况下使用更长的、不可移植的代码?

标签: c++ gcc clang intrinsics


【解决方案1】:

来自gcc manual

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

库函数是编译器的外部函数,因此它无法像内置函数那样推理它们。例如,编译器可能会在constant folding 中使用内置函数,例如。将__builtin_sqrt(1) 替换为1,而调用库sqrt(1) 通常不能这样做。

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

【讨论】:

  • @MarcGlisse ...因为它用__builtin_sqrt替换它。
  • 看起来 GCC 在 -O3 处的结果相同:godbolt.org/g/J1ztkQ
  • 我不会接受这个答案,因为它的前提似乎不正确?
  • 我已经更新了我的答案,以包含来自 gcc 文档的更好报价。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
  • 1970-01-01
  • 2018-09-20
  • 2016-04-21
  • 2018-06-11
  • 1970-01-01
  • 2018-02-08
相关资源
最近更新 更多