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