gpt4 book ai didi

c++ - 内存移动与向后复制

转载 作者:太空狗 更新时间:2023-10-29 23:33:07 28 4
gpt4 key购买 nike

我知道 C(cstring 库)中的 memmove 可以很好地处理重叠“以较慢的运行时间为代价”(参见 this post)。我想知道为什么这个额外的运行时成本?在我看来,任何重叠问题都可以通过向后复制而不是向前复制来解决,我错了吗?

作为玩具示例,这里有两个版本的“右移”函数,将数组的内容向右移动一个元素:

// 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 的版本在这种情况下是不安全的。

最佳答案

假设一个很好的实现,唯一的“额外成本”是memmove是决定是从前到后还是从后到前复制的初始检查(添加和比较和分支)。此成本完全可以忽略不计(添加和比较将被 ILP 隐藏,并且分支在正常情况下是完全可预测的)以至于在某些平台上,memcpy只是 memmove 的别名.

期待您的下一个问题(“如果 memcpy 没有明显快于 memmove,它为什么存在?”),有几个很好的理由保留 memcpy大约。在我看来,最好的一个是一些 CPU 基本上将 memcpy 实现为一条指令(例如,x86 上的 rep/movs)。这些 HW 实现通常具有首选(快速)操作方向(或者它们可能仅支持在一个方向上进行复制)。编译器可以自由替换 memcpy使用最快的指令序列而无需担心这些细节;它不能为 memmove 做同样的事情.

关于c++ - 内存移动与向后复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22158053/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com