在什么平台memmove和memcpy可以有显着的性能差异?

时间:2013-10-25 09:22:49

标签: c++ c performance

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

在libgcc中,memmove类似于memcpy,它们只是通过一个字节和一个字节,因此即使在优化之后性能也几乎相同。

有人测量了这一点并得到了这篇文章memcopy, memmove, and Speed over Safety。即使我不认为memmove可能比memcpy更快,但至少在Intel平台上应该没有太大差异。

那么在什么平台和方式中,memcpy可以明显快于memmove,如果没有,为什么提供两个类似的功能而不仅仅是memmove,并导致很多臭虫。

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

2 个答案:

答案 0 :(得分:3)

至少有一种情况是使用非重叠内存的约束来生成更快的代码:

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

另见Make compiler copy characters using movsd

作为内置函数实现的GCC also lists memcpy,实现和动机很可能类似于Visual Studio。

答案 1 :(得分:-2)

良好做法:一般情况下,只有在必要时,USE才能保留。当源和目标区域重叠的可能性非常合理时使用它。

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

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