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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • 基于C++实现柏林噪声算法(Perlin Noise)

    基于C++实现柏林噪声算法(Perlin Noise)

    Perlin噪声(Perlin noise,又称为柏林噪声)指由Ken Perlin发明的自然噪声生成算法,具有在函数上的连续性,并可在多次调用时给出一致的数值。本文将用C++实现柏林噪声算法,感兴趣的可以了解一下
    2023-03-03
  • 求解旋转数组的最小数字

    求解旋转数组的最小数字

    这篇文章主要介绍了求解旋转数组的最小数字的相关资料,需要的朋友可以参考下
    2017-05-05
  • C++14 新特性之函数返回值类型推导

    C++14 新特性之函数返回值类型推导

    本文主要介绍了C++14 新特性之函数返回值类型推导,在模板编程和一些返回类型复杂或不易直接指明的情况下非常有用,下面就来具体介绍一下,感兴趣的可以了解一下
    2024-05-05
  • C++11 并发指南之多线程初探

    C++11 并发指南之多线程初探

    这篇文章主要介绍了C++11 并发指南之多线程初探,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • C++类的定义和对象的创建详解

    C++类的定义和对象的创建详解

    本篇文章重点讲解了两种创建对象的方式:一种是在栈上创建,形式和定义普通变量类似;另外一种是在堆上使用 new 关键字创建,必须要用一个指针指向它,下面和小编一起来学习下面为文章的内容
    2021-09-09
  • C++中静态存储区与栈以及堆的区别详解

    C++中静态存储区与栈以及堆的区别详解

    本篇文章是对C++中静态存储区与栈以及堆的区别进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++语言实现线性表之链表实例

    C++语言实现线性表之链表实例

    这篇文章主要介绍了C++语言实现线性表之链表,实例分析了C++实现线性表中链表的原理与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • C语言对对碰游戏源码分享

    C语言对对碰游戏源码分享

    这篇文章主要为大家分享了C语言对对碰游戏源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • C语言 栈与数组的实现详解

    C语言 栈与数组的实现详解

    栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素
    2022-04-04
  • C/C++预处理浅析使用形式

    C/C++预处理浅析使用形式

    预处理是指在进行编译的词法扫描和语法分析之前所作的工作。预处理指令指示在程序正式编译前就由编译器进行的操作,可放在程序中任何位置。处理完毕自动进入对源程序的编译。C/C++中的预处理主要包含三种:文件包含、宏定义、条件编译
    2022-09-09

最新评论