前言:最近在读项目源码,发现有些地方用std::copy,有些地方用memcpy。但是并不知道为什么要这样,但是原作者也不认识,就只好自己研究一下了。
对比
相同:
- 都是复制拷贝函数。
- 都是通过指针操作进行内存复制。
不同:
- std::copy是C++中的函数,memcpy是C中的函数。
- std::copy更加灵活,可以在不同类型的对象之间进行复制;memcpy只能用于字节级别的复制,不能处理自定义类型。
- std::copy拷贝类的时候,会调用贝构造函数或赋值运算符来复制;memcpy只会按字节复制,不会调用类的任何成员函数。
- std::copy的性能比memcpy会更好
使用场景
从两者的不同点就可以看的出来,大致使用场景的区别了。
适合std::copy:
- 处理非平凡类型,使用memcpy会导致未定义行为,std::copy能确保处理正确的生命周期。
- 对于结构体或者类中有指针成员变量的情况,memcpy进行拷贝只是进行了浅拷贝,会导致指针成员变量的指向不正确,从而导致未定义行为。
- 当源和目标内存区域有重叠的时候。
适合memcpy:
- 对于简单数据类型(例如int、char、float等基本的类型),使用memcpy而不是std::copy。
- 当源和目标内存区域没有重叠,memcpy可以直接位拷贝,不会涉及迭代器和复制构造函数等操作。
总结以下,C++才加入的类型或者自行定义的类型、涉及深拷贝、源和目标内存区域有重叠的时候适合std::copy,其它时候用memcpy好点。
补充:平凡类型trivial和非平凡类型non-trivial。
这个主要是针对类中的四个函数来说的:构造函数、复制构造函数、赋值函数以及析构函数。
如果满足以下三点任意一点,就是非平凡类型non-trivial:
- 显式定义了上面四种函数。
- 类里面有非静态非POD的成员(POD可以理解为包含平凡类、标准布局类)。
- 有基类。
使用
std::copy
把src里面的内容复制到dst。
vector<int>src= { 0, 1, 2, 3, 4 }; vector<int>dst(5, 0); std::copy(src.begin(), src.end(),dst.begin());// src起始地址,src末尾下一个,dst起始地址
memcpy
因为memcpy是C那边的,所以用vector不太合适,适合简单的数据类型。
const char src[50] = "http://www.runoob.com"; char dst[50]; // strlen(src)不包括结束符 memcpy(dst, src, strlen(src)+1);// dst起始地址,src起始地址,复制长度
到此这篇关于C++ std::copy与memcpy区别小结的文章就介绍到这了,更多相关C++ std::copy memcpy内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!