【问题标题】:Order of execution for `::memcpy` [duplicate]`::memcpy`的执行顺序[重复]
【发布时间】:2014-04-16 08:02:02
【问题描述】:

我正在编写一个类成员函数来从 (m x n) 矩阵中删除一行。矩阵的内存模型(来自标准线性代数库)保证是一个连续的块,因此第 (i, j) 个元素映射到该内存块的第 (i * n + j) 个元素。

出于清晰和性能原因,我想使用::memcpy。 (使用for 循环的替代方法很麻烦。)但我需要一些保证。

一般来说,目标位置重叠源位置,因为如果我要删除行r,我会使用(为了清楚起见,删除任何演员表),

::memcpy(r * n, (r + 1) * n, bigger than n in general)

如果::memcpy 保证从块的开头复制,那么这就可以了。但是,标准能保证这一点吗?我不明白为什么会这样,并且怀疑此类代码的行为是未定义

【问题讨论】:

  • 在现代系统上,for 循环的性能通常与memcpy 一样好或更好。当您通过for 循环调用时,某些编译器可以利用类型和对齐信息,但在您调用memcpy 时却不能。 (并且 方式memmove 更好,因为方向更有可能在编译时而不是在运行时确定。)

标签: c++ memcpy


【解决方案1】:

您应该使用memmove 而不是memcpy。定义了memmove 的重叠行为。

用户thang 在评论中指出,有一个related article 讨论了memcpymemmove 之间的区别。

【讨论】:

    【解决方案2】:

    您是否考虑过使用std::copystd::copy_backwards

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-19
      • 2018-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-29
      相关资源
      最近更新 更多