C++ std::copy与memcpy区别小结

 更新时间:2024年05月08日 08:31:10   作者:魔法自动机  
本文主要介绍了C++ std::copy与memcpy区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言:最近在读项目源码,发现有些地方用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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Qt实现自定义日志类的示例代码

    Qt实现自定义日志类的示例代码

    这篇文章主要为大家详细介绍了使用 qInstallMessageHandler() 实现一个简单的日志工具,文中的示例代码讲解详细,感兴趣的小伙伴可以学习一下
    2023-12-12
  • C++实现从数组中同时取出最大最小元素算法示例

    C++实现从数组中同时取出最大最小元素算法示例

    这篇文章主要介绍了C++实现从数组中同时取出最大最小元素算法,结合具体实例形式分析了C++通过数组的遍历、排序获取最大与最小元素的相关操作技巧,需要的朋友可以参考下
    2017-09-09
  • Vs2022环境下安装低版本.net framework的实现步骤

    Vs2022环境下安装低版本.net framework的实现步骤

    本文主要介绍了Vs2022环境下安装低版本.net framework的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • C++中四种强制转换方式的区别

    C++中四种强制转换方式的区别

    在C++中,有四种不同的强制转换方式,它们分别是静态转换、动态转换、常量转换和重新解释转换,下面通过示例代码讲解每种转换的区别,感兴趣的朋友跟随小编一起看看吧
    2023-08-08
  • C语言中.c和.h文件区别讲解

    C语言中.c和.h文件区别讲解

    这篇文章主要介绍了C语言中.c和.h文件区别讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是本文的详细内容,需要的朋友可以参考下
    2021-07-07
  • C++数字三角形问题与dp算法

    C++数字三角形问题与dp算法

    这篇文章主要介绍了C++数字三角形问题与dp算法的相关知识,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2018-09-09
  • C++ 二叉树的镜像实例详解

    C++ 二叉树的镜像实例详解

    这篇文章主要介绍了C++ 二叉树的镜像实例详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • Linux vmstat命令实战详细解析

    Linux vmstat命令实战详细解析

    这个命令是我查看Linux/Unix最喜爱的命令,一个是Linux/Unix都支持,二是相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)
    2013-09-09
  • 通过代码实例解析c++ vector常用方法

    通过代码实例解析c++ vector常用方法

    这篇文章主要介绍了通过代码实例解析c++ vector常用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • C++右值引用问题解决

    C++右值引用问题解决

    本文主要介绍了C++右值引用问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06

最新评论