我在What is the difference between memmove and memcpy?中看到了接受答案的不同之处,它说memmove might be very slightly slower than memcpy
我们可以通过如下方法实现memmove的替代方案:分配一个临时缓冲区,然后memcpy两次(src->tmp,tmp->dest)。我的问题是:哪种方式更快,memmove还是另一种方式?

最佳答案

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;

这是合法的:
float a = 10.0;
int b;
std::memcpy(std::addressof(b), std::addressof(a), size(b));

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

关于c++ - memmove的性能是memcpy的两倍?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44966288/

10-11 01:02