Necesito borrar una parte de la memoria ( float
s de 32 bits) a cero, y uso my_set()
:
static inline void my_set(float *dst, float v, int n) { while (n-- > 0) *(dst++) = v; }
#define MY_SIZE 1024 int main() { float my_mem[MY_SIZE]; my_set(&my_mem, 0.0f, MY_SIZE) }
¿Debería usar memset() en su lugar? ¿Funcionará mejor en una plataforma con recursos limitados? ¿ GCC optimizará my_set
para usar memset
?
Parece que lo hará: https://godbolt.org/z/hP8jr1odP
Parece que depende de la arquitectura y el tamaño de la matriz, pero generalmente se optimizará para memset
: https://godbolt.org/z/YqnrEfPGY
#define MY_SIZE 1024 * 1024 static inline void my_set(float *dst, float v, int n) { while (n-- > 0) *(dst++) = v; } float my_mem[MY_SIZE]; int main() { my_set(my_mem, 0.0f, MY_SIZE); }
Tamaño de matriz \ Arquitectura | x86_64 | brazo | brazo64 | riesgo-v |
---|---|---|---|---|
1 KiB | círculo | conjunto de miembros | conjunto de miembros | conjunto de miembros |
1 MiB | conjunto de miembros | conjunto de miembros | conjunto de miembros | conjunto de miembros |
Aún así, confiaría en que el compilador sepa qué es lo mejor y no se preocupe demasiado.
¿Debería usar memset() en su lugar?
Sí.
¿Funcionará mejor en una plataforma con recursos limitados?
Sí. O al menos no funcionará peor.
¿GCC optimizará my_set para usar memset?
Si no talvez. Al compilar con -ffreestanding
(objetivo de sistemas integrados), intenta no incluir ninguna llamada de biblioteca y luego descarta cualquier llamada memset
. De lo contrario, en entornos similares a PC, el código de la máquina parece reducirse a una llamada de memset
.
Tenga en cuenta que establecer algo en cero explícitamente o establecerlo en un valor generará un código de máquina muy diferente.
memset
y funciones de biblioteca similares están optimizadas para funcionar bien en el ancho de datos de la CPU. Que no es necesariamente lo mismo que el ancho de datos de un flotante, normalmente de 32 bits.