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?
答案 0 :(得分:14)
前段时间我一直在尝试内置替换,我发现只有在编译时知道source参数的大小时才会替换<string.h>
函数。在这种情况下,对libc
的调用将直接由展开的代码替换。
除非您使用-fno-builtin
,-ansi
,-std=c89
或类似内容进行编译,否则您使用__builtin_
前缀的确无关紧要。
虽然很难遵循,但是拒绝发出库调用或代码块的代码似乎是here。