2012-07-31 25 views
13

Hay una versión de la función C99/posix memcpy en GCC: __builtin_memcpy.Cuando __builtin_memcpy se reemplaza por memcpy de libc

A 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. P.ej. se observó here:

Por último, en una nota del compilador, __builtin_memcpy puede recurrir a la emisión de una llamada a la función memcpy.

¿Cuál es la lógica en esta selección? ¿Es lógico lo mismo en otros compiladores compatibles con gcc, como clang/llvm, compilador intel C++, PCC, suncc (oracle studio)?

¿Cuándo preferiría usar __builtin_memcpy sobre memcpy simple?

+2

Parece que utiliza una versión en línea cuando el tamaño es una constante de tiempo de compilación y es menor o igual que 8192. –

Respuesta

14

He estado experimentando con el reemplazo incorporado hace algún tiempo y descubrí que las funciones <string.h> solo se reemplazan cuando se puede conocer el tamaño del argumento fuente en tiempo de compilación. En cuyo caso, la llamada al libc se reemplaza directamente por un código desenrollado.

A menos que se compila con -fno-builtins, -ansi, -std=c89 o algo similar, que en realidad no importa ya sea que se utilice el prefijo __builtin_ o no.

Aunque es difícil de seguir, el código que indica si se debe emitir una llamada a la biblioteca o un fragmento de código parece ser here.

+0

¿Qué versión de gcc y nivel de optimización se estudió? – osgx

+0

'gcc' versión 4.6 usando' -O3' y '-fomit-frame-pointer'. Antes de responder, probé con 4.7 también. – C2H5OH

+0

¿El resultado para -O0 es el mismo? – osgx

Cuestiones relacionadas