4

关于copy vs. memcpy vs memmove (excellent info here, btw.)问题,我一直在阅读, 我看来,这俗语不同,例如在cppreference注意:memcpy 已更改为memmove 自从引用了这个报价。 --

笔记

在实践中,std::copy避免多次赋值并使用批量复制功能,例如std::memcpy如果值类型是 TriviallyCopyable

-- std::copy(nor std::copy_backward)不能根据 来实现memcopy,因为std::copy只有目标范围的开头不能落入源范围,但整个memcpy范围不能重叠。

查看 Visual-C++ 的实现(参见xutility标题),我们还可以观察到 VC++ 使用memmove,但现在它的要求比std::copy

...对象可能重叠:复制就像将字符复制到临时字符数组中一样,然后从数组中复制字符...

所以看起来不可能实现,但使用std::copy实际上是一种悲观。(一点点悲观,可能无法衡量,但仍然)memcpymemmove

回到问题:我的总结是否正确?这在任何地方都有问题吗?无论指定什么,是否有可能的实际实现memcpy也不能满足 的要求std::copymemcpy当范围部分重叠时是否存在中断的实现?std::copy

4

1 回答 1

2

如果问题是,是否有可能遇到具有足够未定义行为的有效 memcpy 实现以在重叠范围内不信任它,那么答案是肯定的。:-)

考虑 Power(PC) 架构上 memcpy 的一种可能实现:lmw 指令会将多个连续字从内存加载到连续寄存器中(可以指定为用户定义的范围参数)。stmw 然后将提供的寄存器范围保存回内存。因此,我们谈论的是在单个 memcpy 迭代期间由 CPU 缓冲的大约 100/200 字节(32b/64b CPU) - 如果目标范围与源数据重叠,大量数据会破坏目标范围,特别是考虑到 CPU 没有做出任何承诺关于各个加载和存储的相对顺序。

于 2013-10-29T03:12:56.963 回答