memmove 的性能与 memcpy 相比两次?

duo*_*gja 0 c c++ memcpy memmove

我已经看到memmove 和 memcpy 的区别是什么?它说memmove might be very slightly slower than memcpy

我们可以memmove通过执行以下操作来实现替代方法:分配一个临时缓冲区,然后memcpy两次(src -> tmp,tmp -> dest)。我的问题是:哪种方式更快,memmove或者另一种选择?

Ric*_*ges 5

来自http://en.cppreference.com/w/cpp/string/byte/memmove

尽管被指定为“好像”使用了临时缓冲区,但此函数的实际实现不会产生双重复制或额外内存的开销。对于小计数,它可以加载和写出寄存器;对于较大的块,常见的方法(glibc 和 bsd libc)是如果目标在源之前开始,则从缓冲区的开头向前复制字节,否则从结尾向后复制,当存在时回退到 std::memcpy根本没有重叠。

因此,开销很可能是几个条件分支。对于大块,几乎不值得担心。

然而,值得记住的std::memcpy是,这是一个“魔法”函数,是在两种不同类型之间进行转换的唯一合法方式。

在 C++ 中,这是非法的(未定义的行为):

union {
  float a;
  int b;
} u;

u.a = 10.0;
int x = u.b;
Run Code Online (Sandbox Code Playgroud)

这是合法的:

float a = 10.0;
int b;
std::memcpy(std::addressof(b), std::addressof(a), size(b));
Run Code Online (Sandbox Code Playgroud)

如果你是一个 C 程序员,你会期望工会做的事情。