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