【问题标题】:When __builtin_memcpy is replaced with libc's memcpy当 __builtin_memcpy 被 libc 的 memcpy 替换时
【发布时间】:2012-07-29 16:17:32
【问题描述】:

GCC 中有一个版本的 C99/posix memcpy 函数:__builtin_memcpy

有时它可以被 GCC 替换为内联版本的 memcpy,而在其他情况下它被调用 libc 的 memcpy 替换。例如。有人注意到here

最后,在编译器注释中,__builtin_memcpy 可以退回到发出 memcpy 函数调用。

这个选择的逻辑是什么?其他 gcc 兼容编译器的逻辑是否相同,例如 clang/llvm、intel c++ 编译器、PCC、suncc (oracle studio)?

什么时候我应该更喜欢使用 __builtin_memcpy 而不是普通的 memcpy?

【问题讨论】:

  • 当大小是编译时间常数并且小于等于8192时,它似乎使用了内联版本。

标签: gcc c99 memcpy built-in


【解决方案1】:

前段时间我一直在尝试使用内置替换,我发现只有在编译时可以知道源参数的大小时才会替换<string.h> 函数。在这种情况下,对libc 的调用将直接替换为展开的代码。

除非您使用-fno-builtin-ansi-std=c89 或类似的东西进行编译,否则您是否使用__builtin_ 前缀实际上并不重要。

虽然很难理解,但决定是否发出库调用或一段代码的代码似乎是here

【讨论】:

  • 研究了哪个gcc版本和优化级别?
  • gcc 4.6 版使用-O3-fomit-frame-pointer。在回答之前,我也用 4.7 进行了测试。
  • 对不起,我的错。这些函数从第一个优化级别(-O1 或简单的-O)替换。
猜你喜欢
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
  • 2017-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-10
相关资源
最近更新 更多