当__builtin_memcpy被libc的memcpy替换时

osg*_*sgx 16 gcc c99 built-in memcpy

memcpyGCC中有一个C99/posix 函数版本:__builtin_memcpy.

有时它可以被GCC替换为内联版本的memcpy,在其他情况下,它被替换为调用libc的memcpy.例如,这里注意到:

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

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

当我更喜欢使用__builtin_memcpy而不是简单的memcpy?

C2H*_*5OH 15

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

除非你有编译-fno-builtin,-ansi,-std=c89或类似的东西,它其实并不重要无论您使用的__builtin_前缀或没有.

虽然很难遵循,但是拒绝发出库调用或代码块的代码似乎就在这里.