我正在编写一个类成员函数来从(m×n)矩阵中删除一行。矩阵的存储器模型(来自标准线性代数库)保证是连续的块,使得第(i,j)个元素映射到该存储器块的第(i * n + j)个元素。
出于清晰度和性能原因,我想使用::memcpy
。 (使用for
循环的替代方法很麻烦。)但我需要一些保证。
一般情况下,目标位置重叠源位置,因为如果我删除行 r ,我会使用(删除任何强制转换)清晰度),
::memcpy(r * n, (r + 1) * n, bigger than n in general)
如果保证::memcpy
从块的开头复制,那么这将没问题。但是,标准是否保证了这一点?我不明白为什么会这样,并怀疑这些代码的行为是 undefined 。
答案 0 :(得分:2)
您应该使用memmove
代替memcpy
。 memmove
的重叠行为已定义。
用户thang在评论中指出,有一个related article会讨论memcpy
和memmove
之间的区别。
答案 1 :(得分:1)
您是否考虑过使用std::copy
或std::copy_backwards
?