我了解memmove
和memcpy
的区别在于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更快的平台吗?
答案 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