据说,正如 Nawaz 所说,作业版本应该在大多数平台上更快。这是因为memcpy() 会逐字节复制,而第二个版本可以一次复制 4 个字节。
与往常一样,您应该始终分析应用程序,以确保您预期的瓶颈与现实相符。
编辑
同样适用于动态数组。既然你提到了 C++,那么在这种情况下你应该使用std::copy() 算法。
编辑
这是带有 GCC 4.5.0 的 Windows XP 的代码输出,使用 -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 个字节。