在哪个平台上,memmove和memcpy的性能差异会很大?

6
我知道`memmove`和`memcpy`的区别在于`memmove`能处理内存重叠的情况。我查看了`libgcc`中的实现,并从英特尔网站获得了这篇文章[memcpy性能]
在`libgcc`中,`memmove`与`memcpy`类似,两者都逐字节复制,所以即使经过优化,性能也应该几乎相同。
有人测量了这一点,并得到了这篇文章memcopy、memmove和速度超过安全性。虽然我不认为`memmove`比`memcpy`更快,但至少在英特尔平台上不应该有太大的差异。
因此,在什么平台上以及如何,`memcpy`可以显着快于`memmove`,如果没有,为什么提供两个类似的函数而导致大量错误。
编辑:我不是在询问`memmove`和`memcpy`的区别,我知道`memmove`可以处理重叠问题。问题是是否真的有任何平台,`memcpy`比`memmove`快?

2
已经有很多关于 memcpymemmove 的问题了(请参见右侧的“相关”栏)。你确定你的问题没有被其中一个覆盖吗? - Oliver Charlesworth
3
请阅读整个问题。看起来他知道定义上的区别,但实际上似乎没有什么区别。问题是“在哪些平台上真正有所区别?” - BoBTFish
1
@Oli Charlesworth,我不是在问memmove和memcpy的区别,我知道memmove可以处理重叠问题。问题是,是否真的有任何平台上memcpy比memmove更快? - ZijingWu
4
这个问题不是重复列出的那些问题! - BoBTFish
1
@BoBTFish 在将问题标记为重复之前阅读一下它并不是 Stack Overflow 的做法。你正在妨碍进步™。</讽刺> - jalf
显示剩余4条评论
2个回答

3

至少有一个最近的案例表明,非重叠内存的约束条件被用于生成更快的代码:

在Visual Studio中,memcpy可以使用内置函数编译,而memmove则不能。这导致memcpy在已知大小的小区域内比较快,因为它消除了函数调用和设置开销。使用movsd/movsw/movsb实现不适用于重叠块,因为它从最低地址开始复制,复制期间增加edi/esi。

另请参见使用movsd使编译器复制字符

GCC也列出了memcpy作为内置函数实现,其实现和动机可能与Visual Studio类似。


但是为什么movsd/movsw/movsb不适用于重叠复制呢?如果所有参数都已知,编译器也可以选择movsd或movsw。 - ZijingWu
好的,我明白了。大多数情况下,只有块大小是编译时常量。 - ZijingWu
movsX指令始终沿着一个方向移动,从最低地址开始,在复制过程中递增edi/esi。D/W/B仅选择复制单位(DWORD、WORD、BYTE)。 - Suma
1
movsb和它的伙伴们可以向另一个方向进行复制。它们由方向标志控制。没有理由memove不能像memcpy一样快。虽然并不是每个实现都能做到这一点,这是肯定的。 - Yan Zhou
“‘没有理由 memove 不能像 memcpy 一样快’这个说法并不完全正确,正如‘标准与英特尔平台无关’的评论所述。在某些平台上可能会使它像memcpy 一样快,但在所有可能的平台上都不能保证。” - Mike Kaganski

-3

好的实践方法:通常情况下,只有在必要时才使用memmove。当源和目标区域有非常合理的重叠机会时,才使用它。

否则,请使用memcpy。 memcpy更有效率。

参考资料:https://www.youtube.com/watch?v=Yr1YnOVG-4g Jerry Cain博士, (斯坦福入门系统讲座 - 7),时间:36:00


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接