使用memcpy
和std::copy
之间的效率损失有多严重?
我的情况是我的系统上的向量实现似乎没有使用连续内存,这使得我必须稍后std :: copy其内容而不是memcpy(dest, &vec[0], size);
。我不确定这可能会对效率造成多大影响。
答案 0 :(得分:13)
在可能的情况下(即元素类型是POD),一个相当不错的实现将std::copy
编译到调用memmove
。
如果您的实现没有连续存储(C ++ 03标准要求它),memmove
可能比std::copy
快,但可能不会太多。只有当你有测量结果表明它确实是一个问题时,我才开始担心。
答案 1 :(得分:13)
虽然你已经得到了很多好的答案,但我觉得有必要补充一点:即使代码在理论上效率较低,也很少有可能产生任何真正的差异。
原因很简单:在任何情况下,CPU都比内存快很多。即使相对蹩脚的代码仍然容易使CPU和内存之间的带宽饱和。即使所涉及的数据在缓存中,同样的通常仍然是正确的 - 并且(再次)即使使用蹩脚的代码,移动也会很快完成,无论如何都要关注。
相当多的CPU(例如,Intel x86)在硬件中都有一条特殊的路径,在任何情况下都会用于大多数移动,因此在实现之间通常存在 no 的速度差异即使在汇编代码级别,它看起来也有点不同。
最终,如果你关心在内存中移动内容的速度,你应该更多地考虑消除它而不是让它更快。
答案 2 :(得分:6)
std::copy
会在适当时使用memcpy
,因此您只需使用std::copy
并让它为您完成工作。