regard to the问题copy vs. memcpy vs memmove (这里有很好的信息,顺便说一句。),我一直在阅读,看起来似乎对我而言,不像通俗地说,例如在cppreference 注意:自从引用此引号后,memcpy已更改为memmove。 -
注释
在实践中,
std::copy
的实现避免了多次分配 如果值类型为,则使用std::memcpy
等批量复制功能TriviallyCopyable
- std::copy
(也不std::copy_backward
)无法1}}实施,因为 memcopy
只是开头目标范围的不得属于源范围,但 std::copy
整个范围不得重叠。
看看Visual-C ++的实现(参见memcpy
标题),我们也可以观察到VC ++使用memmove,但是那个现在有比xutility
更宽松的要求:
......对象可能重叠:复制就像字符一样 被复制到临时字符数组然后复制到字符 是从阵列中复制的......
因此,似乎无法在std::copy
方面实施std::copy
,但使用memcpy
实际上是一种悲观情绪。 (一点点悲观,可能无法衡量,但仍然)
回到问题:我的摘要是否正确?这是一个问题吗? 无论指定的是什么,是否有memmove
的实际可行实现也不能满足memcpy
的要求,即是std::copy
当范围与memcpy
部分重叠as allowed时会中断的实现?
答案 0 :(得分:2)
如果问题是,是否有可能遇到具有足够未定义行为的高效memcpy实现而不能在重叠范围内信任它,那么答案是肯定的。 : - )
考虑Power(PC)架构上memcpy的一种可能实现:lmw指令将从存储器中将多个连续字加载到连续寄存器中(可以指定为用户定义的范围参数)。然后stmw将提供的寄存器范围保存回内存。因此,我们正在讨论在单个memcpy迭代期间由CPU缓冲的~100 / 200字节(32b / 64b CPU) - 如果它与源代码重叠,大量数据会破坏目标范围,特别是考虑到CPU没有做出承诺关于个人负荷和商店的相对顺序。