内存移动的性能与memcpy相比是两倍?
Performance of memmove compared to memcpy twice?
我已经在memmove和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程序员。
std::memmove
">可能比std::memcpy
稍慢">(强调添加(,因为它必须首先检查源和目标范围是否重叠。在内部,这只是几个指针比较;这样做后,如果没有重叠或目标从源下方开始,它会调用std::memcpy
;否则,它会调用从结尾复制到开头的std::memcpy
变体。
简而言之,唯一的区别是最初的比较;一旦完成,就像std::memcpy
一样。不需要额外的缓冲区并复制所有内容两次。
- 按值 C++ 返回时进行双倍移动
- 重复使用预分配的向量<复杂<double>>作为<double>长度两倍的向量
- 计算C++两倍的差值
- 为什么当我进入退出条件时,程序会打印两倍的默认条件而不是退出 while 循环?
- 内存移动的性能与memcpy相比是两倍?
- Qt 是 JSON 精度的两倍
- 不完整的多线程光线追踪器花费的时间是预期的两倍
- C++随机函数给出的相同整数是输出的两倍
- 为什么我的最终向量是它应该大小的两倍并且具有前导 0?
- 为什么即使在从int到两倍的类型施放后,小数也没有小数
- 如何将固定精度的两倍格式化为给定的长度
- getsockopt() 返回的值是之前由 setsockopt() 设置的值的两倍
- MF SinkWriter mp4文件的播放持续时间是添加音频样本时的一半,图像的播放速度也是添加音频样本的两倍
- 无论如何,是否可以使用setCursorPos(int,int)函数,但没有采用两个int使它需要速度较慢的两倍
- 是一个包含两个INT(只有两个INT)的结构,保证是大小(INT)的两倍
- C++ "time.h"测量的运行时间是实际值的两倍
- 退出申请致电两倍
- SSE42 & STTNI - PcmpEstrM比PcmpIstrM慢两倍,是真的吗?
- 在同一台机器上,是否保证两倍值的不精确性是一致的
- 当将元素从一个dequeue移动到另一个dequeue时,c++使用两倍的内存