在源和目标重叠时使用memcpy()
会导致未定义的行为 - 在这些情况下,只能使用memmove()
。
但是如果我确定缓冲区不重叠怎么办?是否有理由专门使用memcpy()
或具体memmove()
?我应该使用哪个以及为什么?
答案 0 :(得分:32)
假设一个理智的库实现者,memcpy
将始终至少与memmove
一样快。但是,在大多数平台上,差异很小,并且在许多平台上memcpy
只是memmove
的别名,以支持在重叠缓冲区上(错误地)调用memcpy
的遗留代码。
应编写memcpy
和memmove
,以利用平台上可用的最快加载和存储。
要回答您的问题:您应该使用语义正确的问题。如果可以保证缓冲区不重叠,则应使用memcpy
。如果您不能保证缓冲区不重叠,则应使用memmove
。
答案 1 :(得分:29)
memcpy()
对重叠缓冲区没有任何特殊处理,因此它缺少一些检查,因此它比memmove()
快。
同样在某些体系结构memcpy()
上可以使用CPU指令来移动内存块 - memmove()
无法使用的内容。
答案 2 :(得分:5)
如果您对哪个版本效果更好感兴趣,则需要在目标平台上对其进行测试。标准中没有任何内容规定如何实现这些功能,虽然非检查memcpy
似乎更合理,但这绝不是确定的。
尽管不太可能,为你的特定编译器编写memmove
的人是一个经过认证的天才,而得到写作memcpy
的穷人却是村里的白痴,这是很有可能的:-)
虽然实际上我发现很难想象memmove
可能比memcpy
快,但我并不打算这种可能性。 测量,不要猜测。
答案 3 :(得分:2)
在我正在开发的某个ARM平台上,memmove比memcpy快3倍,用于短的未签名负载。由于memcpy和memmove是唯一真正的便携式打字机制,你可能会认为编译器在尝试使用NEON之前会进行一些检查。