关于gcc:当__builtin_memcpy替换为libc的memcpy时

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

有时,可以将其替换为内联版本的memcpy的GCC,而在其他情况下,可以通过调用libc的memcpy来替换。 例如。 有人在这里指出:

Finally, on a compiler note, __builtin_memcpy can fall back to emitting a memcpy function call.

此选择的逻辑是什么? 在其他与gcc兼容的编译器中,例如clang / llvm,intel c ++编译器,PCC,suncc(oracle Studio),逻辑是否相同?

什么时候比普通的memcpy更喜欢使用__builtin_memcpy?

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

一段时间之前,我一直在尝试使用内置替换,但是发现函数仅在编译时可以知道source参数的大小时才替换。 在这种情况下,对libc的调用将直接由展开的代码替换。

除非您使用-fno-builtin-ansi-std=c89或类似的东西进行编译,否则无论是否使用__builtin_前缀实际上都没关系。

尽管很难遵循,但决定是发出库调用还是代码块的代码似乎在这里。

  • 研究了哪个gcc版本和优化级别?

  • 使用-O3-fomit-frame-pointergcc版本4.6。 在回答之前,我也对4.7进行了测试。

  • 对不起这是我的错。 从第一优化级别(-O1或简称为-O)替换功能。

猜你喜欢

转载自blog.csdn.net/a2831942318/article/details/129632875