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-pointer的gcc版本4.6。 在回答之前,我也对4.7进行了测试。
对不起这是我的错。 从第一优化级别(-O1或简称为-O)替换功能。