memcpy vs asignación en C
struct variable-assignment (1)
¿Bajo qué circunstancias debería esperar que los memcpys superen las asignaciones en el hardware INTEL / AMD moderno? Estoy usando GCC 4.2.x en una plataforma Intel de 32 bits (pero también estoy interesado en 64 bits).
Nunca debe esperar que superen las asignaciones. La razón es que el compilador usará memcpy de todos modos cuando crea que sería más rápido (si usa banderas de optimización). Si no es así, y si la estructura es razonablemente pequeña para que encaje en los registros, se podría utilizar la manipulación directa del registro, lo que no requeriría acceso alguno a la memoria.
GCC tiene patrones de movimiento de bloque especiales internos 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 hacer un 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 en sí?