随着
regard
to
the问题
copy vs. memcpy vs memmove(这里的优秀信息,顺便说一句),我一直在阅读,在我看来,这不像通俗地说的那样,例如在
cppreference注意:memcpy自从接受这个引用后已经改为memmove. –
Notes
In practice, implementations of
std::copy
avoid multiple assignments
and use bulk copy functions such asstd::memcpy
if the value type is
TriviallyCopyable
– std :: copy(也不是std :: copy_backward)不能用memcopy实现,因为对于std :: copy只有目标范围的开头不能落入源范围,但对于memcpy整个范围不得重叠.
看看Visual-C的实现(参见xutility标题),我们也可以观察到VC使用memmove,但是现在这个要求比std :: copy要宽松得多:
… The objects may overlap: copying takes place as if the characters
were copied to a temporary character array and then the characters
were copied from the array …
所以看来用memcpy实现std :: copy是不可能的,但使用memmove实际上是一种悲观. (一点点悲观,可能无法衡量,但仍然)
回到问题:我的总结是否正确?这是一个问题吗?无论指定什么,是否有一个可能的实际实现memcpy不能满足std :: copy的要求,即当范围部分重叠as allowed由std :: copy时,是否存在memcpy实现?
最佳答案 如果问题是,是否有可能遇到具有足够未定义行为的高效memcpy实现而不能在重叠范围内信任它,那么答案是肯定的. 🙂
考虑在Power(PC)架构上实现memcpy的一种可能方式:lmw指令将从存储器中将多个连续字加载到连续寄存器中(可以指定为用户定义的范围参数).然后stmw将提供的寄存器范围保存回内存.因此,我们正在讨论在单个memcpy迭代期间由CPU缓冲的~100 / 200字节(32b / 64b CPU) – 如果它与源代码重叠,大量数据会破坏目标范围,特别是考虑到CPU没有做出承诺关于个人负荷和商店的相对顺序.