gcc c99 memcpy built-in

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 .