我在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/