C++| std::copy与memcpy区别

前言:最近在读项目源码,发现有些地方用std::copy,有些地方用memcpy。但是并不知道为什么要这样,但是原作者也不认识,就只好自己研究一下了。

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起始地址,复制长度

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/7568.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索大型语言模型在信息提取中的应用与前景

随着人工智能技术的快速发展&#xff0c;大型语言模型&#xff08;LLMs&#xff09;在自然语言处理&#xff08;NLP&#xff09;领域取得了显著的进展。特别是在信息提取&#xff08;IE&#xff09;任务中&#xff0c;LLMs展现出了前所未有的潜力和优势。信息提取是从非结构化文…

跨考专业课142分,上岸重邮!

这个系列会邀请上岸学长学姐进行经验分享~ 今天分享经验的同学是我的“关门弟子”&#xff0c;小叮当&#xff0c;跨考上岸重邮通信工程&#xff01;从平时和小叮当的交流和测试&#xff0c;就能看出专业课水平&#xff0c;我一直和她开玩笑说&#xff0c;早点遇到我&#xff…

网站为什么需要固态硬盘服务器

首先&#xff0c;SSD没有旋转磁盘&#xff0c;所以它读写数据的速度比HDD快。了解通过选择SSD固态硬盘服务器可以获得的其他潜在好处。 1.更快的速度&#xff1a;固态硬盘服务器上的站点加载速度可以比HDD服务器上的站点快三倍 2.更高的可靠性&#xff1a;由于缺少活动部件&am…

运行容器时发现内存不足(<2G)--docker版本低:重装docker

一、卸载&#xff1a; sudo yum install -y yum-utilssudo yum remove docker-ce docker-ce-cli containerd.iosudo rm -rf /var/lib/dockersudo rm -rf /var/lib/containerd 二、安装&#xff1a; sudo yum-config-manager --add-repo https://download.docker.com/linux/ce…

如果你作 为Java程序员曾经遭遇过NullPointerException,请举起手

如果你作 为Java程序员曾经遭遇过NullPointerException&#xff0c;请举起手 1.让Optional发光发热&#xff1a;去除代码中对null的检查&#xff0c; 采用防御式检查减少NullPointerException java8实战 书籍 第225页 免费下载链接&#xff1a; https://pan.quark.cn/s/5cf68…

python flask css样式无效

解释&#xff1a; Flask是一个Python的轻量级Web框架&#xff0c;它没有为CSS提供任何内置的支持。如果你在Flask项目中引入了CSS文件&#xff0c;但是这个CSS没有生效&#xff0c;可能的原因有&#xff1a; 路径不正确&#xff1a;你的CSS文件没有放在正确的目录下&#xff0…

GEE数据集——DeltaDTM 全球沿海数字地形模型数据集

DeltaDTM 全球沿海数字地形模型产品 简介 DeltaDTM 是全球沿岸数字地形模型&#xff08;DTM&#xff09;&#xff0c;水平空间分辨率为 1 弧秒&#xff08;∼30 米&#xff09;&#xff0c;垂直平均绝对误差&#xff08;MAE&#xff09;为 0.45 米。它利用 ICESat-2 和 GEDI …

react引入阿里矢量库图标

react引入阿里矢量库图标 登录阿里矢量库&#xff0c;将项目所需的图标放一起 react项目中新建文件夹MyIcon.js 3. 在页面中引入&#xff0c;其中type为图标名称

定时任务的几种实现方式

定时任务实现的几种方式&#xff1a; 1、JDK自带 &#xff08;1&#xff09;Timer&#xff1a;这是java自带的java.util.Timer类&#xff0c;这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行&#xff0c;但不能在指定时间运行。…

Unreal游戏GPU参数详解,游戏性能优化再升级

UWA GOT Online For Unreal GPU模式近期全新发布&#xff0c;方便开发者从渲染和带宽的角度进行GPU分析。同时&#xff0c;此次更新中UWA也增加了丰富的GPU参数&#xff0c;涵盖了GPU SoC和GPU Counter模块。这些新增的参数不仅能够帮助Unreal开发者从宏观层面监控GPU的压力状况…

Python爬虫--Urllib基础

1. urlretrieve Urllib 库也是类似 request 库&#xff0c;用来解析html的 首先讲 urlretrieve 子模块 这个模块的作用是将网页下载到本地 语法&#xff1a; urlretrieve(网址,本地地址) 例如&#xff1a; 这样就可以了&#xff0c;他会将百度网页下载到本地D盘下&#x…

怎么给切面增加开关

为切面添加开关功能&#xff0c;可以在运行时控制是否启用切面逻辑&#xff0c;这对于调试、性能优化或特定场景的灵活控制非常有用。下面是一个基于Spring AOP和配置属性实现的简单示例&#xff0c;展示了如何为切面逻辑添加开关。 步骤 1: 添加配置属性 首先&#xff0c;定…

【管理咨询宝藏93】大型制造集团数字化转型设计方案

【管理咨询宝藏93】大型制造集团数字化转型设计方案 【格式】PDF版本 【关键词】国际咨询公司、制造型企业转型、数字化转型 【核心观点】 - 235页大型制造型集团数字化转型方案设计&#xff01;细节非常详尽&#xff0c;图表丰富&#xff01; - 系统架构必须采用成熟、具有国…

Kafka应用Demo:按主题订阅消费消息

安装环境 Kafka安装可参考官方网站的指导(https://kafka.apache.org/quickstart), 按步骤解压压缩包&#xff0c;修改配置。然后再启动zookeeper和kafka-server即可。 需要注意的一点&#xff1a;如果是在VMware虚拟机上启动的kafka, 需要修改一下server.properties配置文件&am…

STM32G0存储器和总线架构

文章目录 前言一、系统架构二、存储器构成三、存储器地址映射四、存储器边界地址五、外设寄存器边界地址 前言 此文章是STM32G0 MCU的学习记录&#xff0c;并非权威&#xff0c;请谨慎参考。 STM32G0主流微控制器基于工作频率可达64 MHz的高性能Arm Cortex-M0 32位RISC内核。该…

观测云 VS ELK:谁是日志监控的王者?

前言 作为 IT 信息系统运行状态感知和故障分析的重要手段&#xff0c;日志在行业兴起之初便为运维和开发环节所广泛应用。当应用和系统发生故障或出现问题时&#xff0c;日志数据成为了排查和诊断问题的重要依据。通过分析日志&#xff0c;开发人员和运维人员可以了解系统的运…

(python读取目标检测PASCAL VOC数据集,将图像采用边缘填充的方法缩放到相应大小(例如640x640),并修改对应的xml文件

python读取目标检测PASCAL VOC数据集&#xff0c;将图像采用边缘填充的方法缩放到相应大小&#xff08;例如640x640&#xff09;&#xff0c;并修改对应的xml文件 单个文件处理批处理脚本 单个文件处理 import cv2 import os import xml.etree.ElementTree as ETdef resize_im…

苹果审核遇到的问题总结

问题一 Guideline 2.3.3 - Performance - Accurate Metadata 2.3.3 Screenshots should show the app in use, and not merely the title art, login page, or splash screen. They may also include text and image overlays (e.g. to demonstrate input mechanisms, such a…

java JMH 学习

JMH 是什么&#xff1f; JMH&#xff08;Java Microbenchmark Harness&#xff09;是一款专用于代码微基准测试的工具集&#xff0c;其主要聚焦于方法层面的基准测试&#xff0c;精度可达纳秒级别。此工具由 Oracle 内部负责实现 JIT 的杰出人士编写&#xff0c;他们对 JIT 及…

#LLM入门 | langchain | RAG # 4.1 简介_使用 LangChain 访问个人数据

课程介绍&#xff1a;《第四部分&#xff1a;使用 LangChain 访问个人数据》是基于LangChain创始人Harrison Chase与Deeplearning.ai合作开发的课程&#xff0c;旨在教授如何通过LangChain框架使语言模型&#xff08;LLM&#xff09;访问和应用用户个人数据。背景说明&#xff…