使用哪一个 - memmove()或memcpy() - 当缓冲区不重叠时?

时间:2009-12-25 11:10:17

标签: c++ c memory

在源和目标重叠时使用memcpy()会导致未定义的行为 - 在这些情况下,只能使用memmove()

但是如果我确定缓冲区不重叠怎么办?是否有理由专门使用memcpy()或具体memmove()?我应该使用哪个以及为什么?

4 个答案:

答案 0 :(得分:32)

假设一个理智的库实现者,memcpy将始终至少与memmove一样快。但是,在大多数平台上,差异很小,并且在许多平台上memcpy只是memmove的别名,以支持在重叠缓冲区上(错误地)调用memcpy的遗留代码。

应编写memcpymemmove,以利用平台上可用的最快加载和存储。

要回答您的问题:您应该使用语义正确的问题。如果可以保证缓冲区不重叠,则应使用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之前会进行一些检查。