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

sha*_*oth 22 c c++ memory

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

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

Ste*_*non 33

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

应该编写这两者memcpy,memmove以利用平台上可用的最快加载和存储.

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


qrd*_*rdl 29

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

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


pax*_*blo 6

如果您对哪个项目表现更好感兴趣,则需要在目标平台上进行测试.标准中没有任何内容要求如何实现这些功能,虽然非检查memcpy可能更快,但这绝不是确定的.

尽管不太可能,memmove为你的特定编译器编写的人是一个经过认证的天才,而得到写作工作的可怜的灵魂memcpy是村里的白痴,这是很有可能的:-)

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