我知道memmove
在 C (cstring 库)中处理重叠很好“以较慢的运行时间为代价”(见这篇文章)。我想知道为什么这个额外的运行时成本?在我看来,任何重叠问题都可以通过向后而不是向前复制来解决,我错了吗?
作为一个玩具示例,这里有两个版本的“右移”函数,它将数组的内容向右移动一个元素:
// Using memmove
template <typename T>
void shift_right( T *data, unsigned n )
{
if (n)
{
data[n-1].~T();
memmove( data+1, data, (n-1)*sizeof(T) );
new (data) T();
}
}
// Using copy_backward
template <typename Iterator>
void shift_right( Iterator first, Iterator last )
{
Iterator it = last;
std::copy_backward( first, --it, last );
}
它们是等价的吗?性能方面,哪一个最好用?
注意:从@DieterLücking 的评论来看,尽管采取了预防措施,但memmove
在这种情况下使用上述版本是不安全的。