std :: copy的限制是否比std :: memcpy更宽松?

时间:2013-10-25 20:18:04

标签: c++ c stl memcpy memmove

regard to the问题copy vs. memcpy vs memmove (这里有很好的信息,顺便说一句。),我一直在阅读,看起来似乎对我而言,不像通俗地说,例如在cppreference 注意:自从引用此引号后,memcpy已更改为memmove。 -

  

注释

     

在实践中,std::copy的实现避免了多次分配   如果值类型为,则使用std::memcpy等批量复制功能   TriviallyCopyable

- std::copy(也不std::copy_backward无法,因为 memcopy只是开头目标范围的不得属于源范围,但 std::copy整个范围不得重叠。

看看Visual-C ++的实现(参见memcpy标题),我们也可以观察到VC ++使用memmove,但是那个现在有比xutility更宽松的要求:

  

......对象可能重叠:复制就像字符一样   被复制到临时字符数组然后复制到字符   是从阵列中复制的......

因此,似乎无法在std::copy方面实施std::copy,但使用memcpy实际上是一种悲观情绪。 (一点点悲观,可能无法衡量,但仍然)

回到问题:我的摘要是否正确?这是一个问题吗? 无论指定的是什么,是否有memmove的实际可行实现也不能满足memcpy的要求,即是std::copy当范围与memcpy部分重叠as allowed时会中断的实现?

1 个答案:

答案 0 :(得分:2)

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

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