我所知道的所有编译器都会在适当的时候用memcpy替换一个简单的std::copy,或者更好的是,将拷贝向矢量化,这样它会比memcpy更快。
在任何情况下:侧写和找出自己。不同的编译器会做不同的事情,它很可能不会完全按照你的要求去做。
请参阅编译器优化的介绍(pdf)。
下面是GCC对POD类型的简单std::拷贝所做的工作。
#include <algorithm>
struct foo
{
int x, y;
};
void bar(foo* a, foo* b, size_t n)
{
std::copy(a, a + n, b);
}
下面是反汇编(只有-O优化),显示了对memmove的调用:
bar(foo*, foo*, unsigned long):
salq $3, %rdx
sarq $3, %rdx
testq %rdx, %rdx
je .L5
subq $8, %rsp
movq %rsi, %rax
salq $3, %rdx
movq %rdi, %rsi
movq %rax, %rdi
call memmove
addq $8, %rsp
.L5:
rep
ret
如果将函数签名更改为
void bar(foo* __restrict a, foo* __restrict b, size_t n)
然后memmove变成memcpy,以实现轻微的性能改进。注意,memcpy本身将被大量向量化。