【发布时间】: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更好,因为方向更有可能在编译时而不是在运行时确定。)