【发布时间】:2014-10-27 02:14:21
【问题描述】:
我在使用 Aztec 线性系统求解器库时遇到了奇怪的行为。使用 valgrind,我发现这个库在重叠缓冲区上做了一个memcpy。规范表明memcpy 在重叠缓冲区上的行为未定义。
事实证明,memcpy 在许多机器上的行为与使用 for 循环执行此操作的行为相同,因此您可以安全地从较高的源复制到较低的目标:
for(int i = 0; i < len; i ++)
dest[i] = source[i];
但是在我们的大型集群上,memcpy 的重叠缓冲区具有不同的行为,这会导致问题。
现在我想知道库中重叠的memcpy 是正常的还是只是由我的代码中的另一个错误引起的。由于该库被广泛使用,我认为memcpy 问题应该更早被发现。另一方面,绝大多数memcpy 实现仍有可能表现得像 for 循环,因此没有人遇到过这个问题。
- 谁能告诉我他在各种机器上重叠
memcpy的经历? - 我的计算机系统的哪个部分实际上提供了
memcpy?
我想指出,这个问题是关于各种实现的实际经验,而不是规范所说的。
【问题讨论】:
-
请提供一个最小示例,以便我们重现您的问题并让您知道错误是在库中还是在您的代码中。
-
我从来没有理解过 memcpy 的这个问题。当然,这只是一个比较来确定您是否需要从源缓冲区的顶部或底部进行复制?
-
@Martin James 很久很久以前,大量 使用
memcpy()的优先级使其非常精简。按照当时的标准,“一个比较”是膨胀软件,通常不需要 - 进一步它阻止了某些优化。它只是减慢了系统的速度。于是memmove()诞生了。 -
@chux orite,谢谢:)