Pregunta

¿En qué circunstancias debería esperar que memcpys supere las asignaciones en el hardware moderno INTEL / AMD? Estoy usando GCC 4.2.x en una plataforma Intel de 32 bits (pero también estoy interesado en 64 bits).

¿Fue útil?

Solución

Nunca debe esperar que superen las asignaciones. La razón es que el compilador usará memcpy de todos modos cuando piense que sería más rápido (si usa banderas de optimización). De lo contrario, y si la estructura es razonablemente pequeña y se ajusta a los registros, se podría utilizar la manipulación directa de registros que no requeriría ningún acceso a la memoria.

GCC tiene patrones especiales de movimiento de bloques internamente que determinan cuándo cambiar directamente los registros / celdas de memoria, o cuándo usar la función memcpy. Tenga en cuenta que al asignar la estructura, el compilador sabe en tiempo de compilación qué tan grande será el movimiento, por lo que puede desenrollar copias pequeñas (hacer un movimiento n veces en fila en lugar de bucle), por ejemplo. Nota -mno-memcpy :

-mmemcpy
-mno-memcpy
    Force (do not force) the use of "memcpy()" for non-trivial block moves.  
    The default is -mno-memcpy, which allows GCC to inline most constant-sized copies.

¿Quién sabe mejor cuándo usar memcpy que el compilador mismo?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top