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

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

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

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

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

要回答您的问题:您应该使用语义正确的问题。 如果可以保证缓冲区不重叠,则应使用memcpy 。 如果您不能保证缓冲区不重叠,则应使用memmove

memcpy()对重叠缓冲区没有任何特殊处理,因此它缺少一些检查,因此它比memmove()更快。

另外在某些体系结构上, memcpy()可以从使用CPU指令移动内存块中受益 – 这是memmove()无法使用的内容。

如果您对哪个性能更好感兴趣,则需要在目标平台上进行测试。 标准中没有任何内容要求如何实现这些function,虽然非检查memcpy速度似乎合乎逻辑,但这绝不是确定的。

为你的特定编译器编写memmove的人很有可能,虽然不太可能是一个认证的天才,而得到写memcpy工作的穷人是村里的白痴:-)

虽然,实际上,我发现很难想象memmove可能比memcpy更快,但我并不打算这种可能性。 测量,不要猜。

在我工作的某个ARM平台上,memmove比memcpy快3倍,用于短的未签名负载。 由于memcpy和memmove是唯一真正的便携式打字机制,你可能会认为编译器在尝试使用NEON之前会进行一些检查。