6

我理解这一点memmovememcpy不同之处在于memmove处理内存重叠情况。我检查了 libgcc 中的实现,并从 intel 网站获得了这篇文章[memcpy performance] 。

在 libgcc 中,与memmove类似memcpy,都是一个字节一个字节,所以优化后性能应该差不多。

有人对此进行了测量,并得到了这篇文章memcopy、memmove 和 Speed over Safety。即使我不认为memmove可以比 快memcpy,但至少在Intel平台上应该没有太大区别。

那么在什么平台以及如何,memcpy可以明显快于memmove,如果没有,为什么提供两个类似的功能而不是仅仅提供两个类似的功能memmove,并导致很多错误。

编辑:我不是在问 memmove 和 memcpy 的区别,我知道 memmove 可以处理重叠问题。问题是真的有什么平台 memcpy 比 memmove 快吗?

4

2 回答 2

3

最近至少有一个案例使用非重叠内存的约束来生成更快的代码:

在 Visual Studiomemcpy中可以使用内部函数进行编译,而memmove不能。由于消除了函数调用和设置开销,这导致memcpy已知大小的小区域更快。使用movsd//的实现不适合重叠块,因为它从最低地址开始复制,在复制过程中增加 edi/esi movswmovsb

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

GCC 还将memcpy 列为内置实现,其实现和动机可能与 Visual Studio 相似。

于 2013-10-25T11:02:46.023 回答
-2

好的做法:一般来说,只有在必要时才使用 memmove。当源区域和目标区域重叠的可能性非常合理时使用它。

否则使用 memcpy。memcpy 效率更高。

参考: https ://www.youtube.com/watch?v= Yr1YnOVG-4g Dr. Jerry Cain,(Stanford Intro Systems Lecture - 7)时间:36:00

于 2016-12-10T02:38:08.577 回答