繁体   English   中英

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

[英]Which one to use - memmove() or memcpy() - when buffers don't overlap?

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

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

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

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

要回答你的问题:你应该使用语义正确的那个。 如果可以保证缓冲区不重叠,则应使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM