Supuestamente, como dijo Nawaz, la versión de asignación debería ser más rápida en la mayoría de las plataformas. Esto se debe a que memcpy()
copiará byte por byte, mientras que la segunda versión podría copiar 4 bytes a la vez.
Como siempre es el caso, siempre debe perfilar las aplicaciones para asegurarse de que lo que espera ser el cuello de botella coincida con la realidad.
Editar
Lo mismo se aplica a la matriz dinámica. Como mencionas C++, deberías usar el algoritmo std::copy()
en ese caso.
Editar
Esta es la salida de código para Windows XP con GCC 4.5.0, compilado con la bandera -O3:
extern "C" void cpy(float* d, float* s, size_t n)
{
memcpy(d, s, sizeof(float)*n);
}
he hecho esta función porque OP especifica matrices dinámicas también.
conjunto de salida es el siguiente:
_cpy:
LFB393:
pushl %ebp
LCFI0:
movl %esp, %ebp
LCFI1:
pushl %edi
LCFI2:
pushl %esi
LCFI3:
movl 8(%ebp), %eax
movl 12(%ebp), %esi
movl 16(%ebp), %ecx
sall $2, %ecx
movl %eax, %edi
rep movsb
popl %esi
LCFI4:
popl %edi
LCFI5:
leave
LCFI6:
ret
por supuesto, supongo que todos los expertos aquí sabe lo rep movsb
medios.
Esta es la versión asignación:
extern "C" void cpy2(float* d, float* s, size_t n)
{
while (n > 0) {
d[n] = s[n];
n--;
}
}
que produce el código siguiente:
_cpy2:
LFB394:
pushl %ebp
LCFI7:
movl %esp, %ebp
LCFI8:
pushl %ebx
LCFI9:
movl 8(%ebp), %ebx
movl 12(%ebp), %ecx
movl 16(%ebp), %eax
testl %eax, %eax
je L2
.p2align 2,,3
L5:
movl (%ecx,%eax,4), %edx
movl %edx, (%ebx,%eax,4)
decl %eax
jne L5
L2:
popl %ebx
LCFI10:
leave
LCFI11:
ret
que se mueve 4 bytes a la vez.
Supongo que incluso el operador de asignación para float se implementaría utilizando memcpy. Por lo tanto, usar memcpy directamente para toda la matriz sería más rápido – Akhil
No creo en su edición. ¿Por qué el segundo enfoque sería más rápido? memcpy() está diseñado específicamente para copiar áreas de memoria de un lugar a otro, por lo que debe ser tan eficiente como lo permita la arquitectura subyacente. Apuesto a que usará el ensamblaje apropiado cuando corresponda para hacer una copia de la memoria de bloques. –