gcc - Cuando__builtin_memcpy se reemplaza con memcpy de libc
c99 built-in (1)
Hay una versión de la función memcpy
C99 / posix en GCC: __builtin_memcpy
.
Algunas veces puede ser reemplazado por GCC a la versión en línea de memcpy y en otros casos es reemplazado por una llamada a memcpy de libc. Por ejemplo, se observó here :
Finalmente, en una nota del compilador, __builtin_memcpy puede volver a emitir una llamada a la función memcpy.
¿Cuál es la lógica en esta selección? ¿Es la misma lógica en otros compiladores compatibles con gcc, como clang / llvm, compilador intel c ++, PCC, suncc (oracle studio)?
¿Cuándo debería preferir usar __builtin_memcpy en lugar de memcpy?
Había estado experimentando con el reemplazo integrado hace algún tiempo y descubrí que las funciones <string.h>
solo se reemplazan cuando el tamaño del argumento fuente se puede conocer en el momento de la compilación. En cuyo caso, la llamada a libc
se reemplaza directamente por un código desenrollado.
A menos que -fno-builtin
con -fno-builtin
, -ansi
, -std=c89
o algo similar, en realidad no importa si usas el prefijo __builtin_
o no.
Aunque es difícil de seguir, el código que determina si emitir una llamada de la biblioteca o una porción de código parece estar here .