C/C++中Memcopy的性能成本

Cen*_*noc 18 c c++ performance

因此,每当我编写代码时,我总会考虑性能影响.我经常想知道,在性能方面使用memcopy相对于其他功能的"成本"是多少?

例如,我可能正在将一个数字序列写入静态缓冲区并专注于缓冲区内的帧,以便在到达缓冲区末尾时保留帧,我可能会将所有数据记录到开头或者我可以实现一个算法来分摊计算.

Ben*_*igt 23

memcpy通常经过优化,可最大限度地提高大型副本的内存带宽.当然,它没有完全避免副本那么快,而对于固定大小的短副本,直接分配可能会更快,因为memcpy有额外的代码来处理奇数长度.

但是当你需要复制一块内存时,很难击败memcpy.它具有极高的可移植性,大多数编译器都竭尽全力使其快速,无论是使用SIMD指令还是内联.

  • @DeadMG:许多C++程序都在处理"哑"数据,它被C++标准称为"普通旧数据",使用memcpy非常安全.根据我的经验,没有POD的程序类型是用更高级语言编写的程序. (18认同)
  • 是.你*可以*使用memcpy并完全用非POD类型搞砸你的程序.或者,您*可以*使用赋值运算符,这将最终生成POD类型的memcpy和适用于非POD类型的程序. (3认同)
  • 赋值运算符不会导致为POD类型调用`memcpy`.它将产生二进制图像,这与`memcpy`的结果相同,没有任何优化.更好的方法是使用`std :: copy`,它将为非POD类型做正确的事情,然后专门化它(可能使用类型特征)来调用优化的块副本,例如`memcpy`,它是安全的. (3认同)
  • 应该避免在C++中使用memcpy,因为它是一个"愚蠢"的副本,可能会导致不好的事情.绝对应该使用赋值运算符/复制构造函数.此外,应首先运行配置文件以确定它是问题所在. (2认同)

小智 6

可以考虑对性能的影响,但是不要对编写好的干净代码的实际目标过于分散注意力。如果您即使对性能有所了解也倾向于对性能着迷,请尝试着眼于更高层次的含义,而忽略诸如的点点滴滴memcpy,您可以信任编译器和库作者进行优化。

通常避免这种低级的过早优化,因为它会浪费您的时间,效果会感染整个程序,并且如果不进行测量,就无法期望获得任何性能提升。