Предположительно, как сказал Наваз, версия назначения должна быть более быстрой на большинстве платформ.Это потому, что memcpy()
будет копировать байты за байтом, в то время как вторая версия может копировать 4 байта за раз.соответствует действительности.
Редактировать
То же самое относится к динамическому массиву.Поскольку вы упоминаете C ++, вам следует использовать алгоритм std::copy()
в этом случае.
Редактировать
Это вывод кода для Windows XP с GCC 4.5.0, скомпилированный с флагом -O3:
extern "C" void cpy(float* d, float* s, size_t n)
{
memcpy(d, s, sizeof(float)*n);
}
Я сделал эту функцию, потому что OP также указал динамические массивы.
Выходная сборка выглядит следующим образом:
_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
Конечно, я предполагаю, что все эксперты здесь знают, что означает rep movsb
.
Это версия задания:
extern "C" void cpy2(float* d, float* s, size_t n)
{
while (n > 0) {
d[n] = s[n];
n--;
}
}
, который дает следующий код:
_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
, который перемещает 4 байта за раз.