c++ - 在什么平台上 memmove 和 memcpy 会有显着的性能差异?

标签 c++ c performance

我知道 memmovememcpy 的区别在于 memmove 处理内存重叠情况。我检查了 libgcc 中的实现并得到了这篇文章 [memcpy performance]来自英特尔网站。

在 libgcc 中,memmove 类似于 memcpy,都是一个字节一个字节地走,所以即使经过优化,性能应该也差不多。

有人测过这个得到这篇文章memcopy, memmove, and Speed over Safety .即使我不认为 memmove 可以比 memcpy 更快,但至少在 Intel 平台上应该没有太大区别。

那么在什么平台上以及如何,memcpy 可以比 memmove 快得多,如果没有,为什么要提供两个类似的函数而不是仅仅 memmove,并导致大量错误。

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

最佳答案

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

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

另见 Make compiler copy characters using movsd .

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

关于c++ - 在什么平台上 memmove 和 memcpy 会有显着的性能差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19585930/

相关文章:

c++ - 标准安全类型检查?

c - 如何使用指针表示法访问动态结构

c - 使用冒泡排序算法对字符串进行排序

performance - FrameTiming和FrameTimingManager的正确用法是什么

c++ - libclang 检查语法

java - 将 final 修饰符与 mutator 方法一起使用

c++ - _vimrc 中为 cmake 和 doxygen 提供的命令在 gvim 启动时出现错误?

ios - UIAlertController 缓慢出现和关闭 - Swift

javascript - cpu能比:phantom:page be more than 1:1:1

c++ - 在 Ubuntu 上使用 Clion 进行 lncurses