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