std :: copy vs memcpy的效率

Joh*_*0te 6 c++ performance stl

使用memcpystd::copy?之间的效率损失有多严重?

我有一种情况,我的系统上的矢量实现似乎没有使用连续的内存,这使得我必须稍后std ::复制其内容而不是做memcpy(dest, &vec[0], size);.我不确定这可能会对效率造成多大影响.

R. *_*des 13

在可能的情况下(即元素类型是POD),一个相当不错的实现将std::copy编译到调用memmove.

如果您的实现没有连续的存储(C++ 03标准要求它),memmove可能会快std::copy,但可能不会太多.只有当你有测量结果表明它确实是一个问题时,我才开始担心.

  • @JerryCoffin:不对.您可以使用`std :: copy`在内存中向后移动一个范围,并使用`std :: copy_backward`向前移动一个范围.(稍微不直观,我批准.) (2认同)

Jer*_*fin 13

虽然你已经得到了许多好的答案,但我还是有必要补充一点:即使代码在理论上效率较低,也很少有可能产生任何真正的差异.

原因很简单:在任何情况下,CPU都比内存快很多.即使相对蹩脚的代码仍然可以轻松地使CPU和内存之间的带宽饱和.即使所涉及的数据都在缓存中,通常也是如此 - 并且(再次)即使使用蹩脚的代码,移动也会很快完成,无论如何都要关注.

相当多的CPU(例如,Intel x86)在硬件中都有一条特殊的路径,在任何情况下都会用于大多数移动,所以在实现之间的速度通常没有区别,即使在程序集中看起来也有点不同代码级别.

最终,如果你关心在内存中移动内容的速度,你应该更多地考虑消除它而不是让它更快.


Ton*_*ion 6

std::copymemcpy在适当时使用,因此您应该使用std::copy并让它为您完成工作.

  • `std :: copy`比`memcpy`更可能调用'memmove`,因为`std :: copy`的范围允许重叠,如果不允许,这并不总是静态可验证的. (3认同)
  • 检查:`的printf"的#include <算法> \nvoid DoCopy(字符*O,常量字符*1,标准::的size_t计数){的std ::拷贝(I,I +计数,O); }'| gcc -S -O3 -o - -std = c ++ 98 -x c ++ -`在我的系统上给出了`jmp memmove`. (2认同)