C++ 左值右值 || std::move() || 浅拷贝,深拷贝 || 数据类型
数据类型:
- 作用:决定变量所占内存空间的字节大小,和布局方式
- 基本数据类型:
- 算数类型:
- 整形(bool / char……扩展集 / int / long……)&& 浮点形(float/double……)
- 部分整形(除了bool && char的扩展集)会有更多的划分:
- 例如:int( int 有符号/ unsigned int无符号) ……
- 对于char(8bit):(char / signed char有符号-128---127 / unsigned char无符号0----256)
- 整形(bool / char……扩展集 / int / long……)&& 浮点形(float/double……)
- 空类型void
- 算数类型:
- 复合类型:声明符/类型修饰符:(& / * / const…… ) + 基本数据类型
- 其他类型:对象(类/结构体)类型……
字面值常量:
- 定义:直接看就可以得到它的值,一望而知
- 这样的常量非常常见,如何知道它的类型?
- 字面值常量的数据类型:由本身决定,不用手动定义,由常量的形式和值决定
- 整形:可以写做二进制、十进制,八进制、十六进制
- 如何看整形的数据类型:
- 默认情况下:十进制(signed),八进制、十六进制(signed / unsigned)
- 默认为算数类型int,也可以为long / long long,具体要在可以容纳当前值的情况下,取最小尺寸
- 其中short不能作为整形字面值的类型
- 如何看整形的数据类型:
- 浮点:默认为double类型的字面值
- 字符:‘ ’为char类型,
- 字符串:“ ”为const char* 类型->常量字符数组[],其中会在字符串末尾添加"\0"空字符
- 指针: nullptr为指针类型字面值
- 布尔:true / false为bool类型字面值
- 整形:可以写做二进制、十进制,八进制、十六进制
变量:
- 对象:有具体类型,并且能存储数据,的内存空间
表达式:
- 概念:由一个或多个运算对象组成(不一定有运算符,比如:字面值42 / 常量a的值)
- 一元/二元/三元/运算符:作用于 一/二/三 个运算对象
- 函数调用:fun();也算作特殊运算符
- 复杂表达式:含有多个运算符,计算方式:遵守:优先级,结合律,求值顺序
左值&&右值
- 左值:(存储在栈)
- 对象(持久对象)
- 变量,常量,数组,指针,引用,表达式……
- 对于常量,不能作为赋值语句的左侧
- 右值:(存储在寄存器)
- 具体数据(临时对象)
- 常量,表达式(变量的值),临时对象……
- 赋值=:要求左侧为可修改的左值(除了const),右侧为右值
- 表达式可以作为左值;用的是在内存的地址
- 也可以作为右值:使用的是内存的地址中存储的值(变量存储的id,对应的val)
- 注意赋值=语句中:左值可以被当作右值使用(它的值),右值(非对象)不能作为左值被赋值
- 作用:……
运算符与左值右值的关系:
- 运算对象:
- 要求左值:赋值的左侧,&取地址(取对象地址),*解引用, 递增递减
- 要求右值:……
- 返回值:
- 要求左值:赋值,*解引用(获取指针所指向地址上的对应的值),递增递减
- 要求右值:取地址(指向运算对象的指针)
- 因此,对于decltype()会根据()括号内是什么运算符,确定返回值
- 比如:&返回右值--type*类型,*返回左值----type&
浅拷贝 && 深拷贝
- 浅拷贝(默认拷贝构造):只复制对象内的基本数据类型的成员变量,而不复制对象内的指针成员变量所指向的内存空间id(指针同时指向一个地址)
- 深拷贝:会同时复制对象内的基本数据类型的成员变量和指针成员变量所指向的内存空间
- 浅拷贝的问题
- 内存泄漏:
- 同一个内存多次释放:由于浅拷贝导致多个对象共享同一块内存,当这些对象在析构时都会尝试释放这块内存,导致同一块内存被多次释放
- 空悬指针:
- 当浅拷贝的对象中的一个对象提前释放,其持有的内存会被释放,而其他对象仍持有指向该内存的指针,这些指针就变成了空悬指针
- 数据不一致:当其中一个对象修改这块内存中的数据时,其他对象的对应数据也会被同时修改,导致数据不一致的问题
- 内存泄漏:
- 如何避免:
- 使用智能指针:
std::shared_ptr和std::unique_ptr - 自定义拷贝构造函数
- 自定义赋值运算符
- 使用智能指针:
- 优缺点:
- 浅拷贝节约内存操作和时间开销,但是会导致指针问题。
- 深拷贝需要更多的内存操作和时间开销,深拷贝通常是更安全、更可靠
拷贝构造 && 拷贝赋值:
- 实现类对象复制的两种特殊成员函数
- 拷贝构造,使用一个已存在的对象来初始化一个新对象时
- 拷贝赋值:将一个对象赋值给另一个已经存在的对象时
移动对象
- 移动对象:不会发生拷贝,大幅度提升性能
- 右值引用:
- &&绑定到右值的引用,绑定的为右值---将要销毁的对象
- 同时普通引用&为了方便区分,为左值引用(绑定的为左值---对象)
- 变量的值当作为表达式时可以有右值属性,但变量本身是左值,所以不能作为&&右值引用的绑定
- 作用:
- 移动语义:直接从临时对象中转移资源,而非通过拷贝
- 完美转发:参数的类型(左值或右值)和值类别(临时或持久)都能被正确无误地传递给目标函数
- 提高程序运行效率
- std::move():显示的将左值转换为对应的右值引用类型
相关文章:
C++ 左值右值 || std::move() || 浅拷贝,深拷贝 || 数据类型
数据类型: 作用:决定变量所占内存空间的字节大小,和布局方式基本数据类型: 算数类型: 整形(bool / char……扩展集 / int / long……)&& 浮点形(float/double……ÿ…...
发那科机器人IO 分配
IO 信号 也称为输入\输出信号,是机器人与外围设备通信的电信号...
ubuntu开机怎么进入、退出命令行界面
要在Ubuntu系统开机时进入命令行界面,可以按照以下步骤操作: 在开机过程中按下Ctrl Alt F1组合键,这将会切换到第一个虚拟控制台,即命令行界面。如果Ctrl Alt F1没有生效,也可以尝试Ctrl Alt F2、Ctrl Alt F3…...
『FPGA通信接口』LVDS接口(4)LVDS接收端设计
文章目录 1.LVDS接收端概述2逻辑框图3.xapp855训练代码解读4.接收端发送端联调5.传送门 1.LVDS接收端概述 接收端的传输模型各个属性应该与LVDS发送端各属性一致,例如,如果用于接收CMOS图像传感器的图像数据,则接收端程序的串化因子、通道个…...
面试题:HTTP的body是二进制还是文本
实际上,HTTP的body可以是二进制数据,也可以是文本。HTTP协议本身不对body内容的格式做限制,具体格式取决于Content-Type头字段的定义。 文本数据: 当Content-Type头字段指定为文本类型时(如text/plain、text/html、ap…...
5分钟带你部署一套Jenkins持续集成环境
5分钟带你部署一套Jenkins持续集成环境 Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。 Jenkins的优点 持续集成和持续交付 作为一个可扩展的自动化服务器,Jenkins 可以用作简单的 CI…...
OpenAI突然宣布停止向中国提供API服务!
标题 🌟 OpenAI突然宣布停止向中国提供API服务! 🌟摘要 📜引言 📢正文 📝1. OpenAI API的重要性2. 停止服务的原因分析3. 对中国市场的影响4. 应对措施代码案例 📂常见问题解答(QA)❓…...
Bootstrap 标签
Bootstrap 标签 引言 Bootstrap 是一个流行的前端框架,它提供了一套丰富的组件和工具,帮助开发者快速构建响应式和移动优先的网页。在 Bootstrap 中,标签(Badge)是一种小巧的组件,用于显示计数、提示或标…...
EtherCAT主站SOEM -- 37 -- win-soem-win10及win11系统QT-SOEM-1个电机转圈圈-周期同步速度模式(CSV模式)
EtherCAT主站SOEM -- 37 -- win-soem-win10及win11系统QT-SOEM-1个电机转圈圈-周期同步速度模式(CSV模式) 0 QT-SOEM及STM32F767-SOEM视频欣赏及源代码链接:0.1 Linux--Ubuntu系统之 QT-SOEM博客、视频欣赏及源代码链接0.2 STM32F767-SOEM 博客、视频欣赏及源代码链接0.3 wi…...
老板舍不得买库存管理软件❓一招解决
在当今快节奏的商业环境中,仓库管理是企业运作中不可或缺的一环。对于许多中小型企业而言,简易且高效的库存管理系统尤为重要。搭贝简易库存管理系统针对仓库的出入库进行有效管理,帮助企业实现库存的透明化和流程的自动化。 客户的痛点 1. …...
【MySQL数据库】:MySQL视图特性
目录 视图的概念 基本使用 准备测试表 创建视图 修改视图影响基表 修改基表影响视图 删除视图 视图规则和限制 视图的概念 视图是一个虚拟表,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行数据。视图中的数据…...
malloc、free和new delete的区别
malloc/free 和 new/delete 是在 C 中分配和释放内存的两种不同方法。它们主要有以下区别: 1. 语法和用法 malloc 和 free: malloc开辟空间时需要手动计算分配的空间大小 int* p (int*)malloc(sizeof(int) * 10); // 分配10个int类型的内存 // 使用内存 free(p); …...
如何有效地优化 Erlang 程序的内存使用,以应对大规模数据处理的需求?
要有效地优化Erlang程序的内存使用,以应对大规模数据处理的需求,可以考虑以下几个方面: 减少不必要的内存分配:避免过多的数据复制和不必要的数据结构创建。可以使用Erlang的二进制数据类型来避免数据复制,使用原子数据…...
vue3项目使用@antv/g6实现可视化流程功能
文章目录 项目需求一、需要解决的问题二、初步使用1.动态数据-组件封装(解决拖拽会留下痕迹的问题,引用图片,在节点右上角渲染图标,实现,事现旋转动画,达到loading效果)2.文本太长,超出部分显示(...),如下函…...
【Linux网络(一)初识计算机网络】
一、网络发展 1.发展背景 2.发展类型 二、网络协议 1.认识协议 2.协议分层 3.OSI七层模型 4.TCP/IP协议 三、网络传输 1.协议报头 2.局域网内的两台主机通信 3.跨网络的两台主机通信 四、网络地址 1.IP地址 2.MAC地址 一、网络发展 1.发展背景 计算机网络的发展…...
Vulhub——Log4j、solr
文章目录 一、Log4j1.1 Apache Log4j2 lookup JNDI 注入漏洞(CVE-2021-44228)1.2 Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645) 二、Solr2.1 Apache Solr 远程命令执行漏洞(CVE-2017-12629)2.…...
linux 设置程序自启动
程序随系统开机自启动的方法有很多种, 这里介绍一种简单且常用的, 通过系统的systemd服务进行自启动。 第一步: 新建一个.service文件 sudo vim /etc/systemd/system/myservice.service[Unit] DescriptionMy Service #Afternetwork.target[…...
PostgreSQL 分区表与并行查询(十)
1. 分区表概述 1.1 什么是分区表 分区表是将大表分割成更小、更可管理的部分的技术。每个分区表都可以单独进行索引和查询,从而提高查询性能和管理效率。 1.2 分区策略 1.2.1 基于范围的分区 按照时间范围或者数值范围进行分区,如按月或按地区。 C…...
React Hooks使用规则:为什么不在条件语句和循环中使用它们
React Hooks为函数组件引入了状态和生命周期特性,极大地增强了其功能。然而,正确使用Hooks是确保组件稳定性和性能的关键。本文将探讨React Hooks的基本规则,以及为什么我们不应该在条件语句和循环中使用它们。 Hooks的基本规则 React团队为…...
【Docker】Consul 和API
目录 一、Consul 1. 拉取镜像 2. 启动第一个consul服务:consul1 3. 查看consul service1 的ip地址 4. 启动第二个consul服务:consul2, 并加入consul1(使用join命令) 5. 启动第三个consul服务:consul3&…...
10个TOTK-Mods-collection实用技巧:提升游戏性能与画面质量
10个TOTK-Mods-collection实用技巧:提升游戏性能与画面质量 【免费下载链接】TOTK-Mods-collection Mod repo for TOTK on Yuzu emulator. 项目地址: https://gitcode.com/gh_mirrors/to/TOTK-Mods-collection TOTK-Mods-collection 是一个专为《塞尔达传说&…...
科学计算的质量守卫:AlphaFold自动化测试实践指南
科学计算的质量守卫:AlphaFold自动化测试实践指南 【免费下载链接】alphafold Open source code for AlphaFold. 项目地址: https://gitcode.com/GitHub_Trending/al/alphafold 技术痛点三连问:你的科学计算项目是否也面临这些困境? …...
基于IGH_Master的EtherCAT主站配置与伺服电机/变频器驱动实战指南
1. IGH_Master与EtherCAT基础入门 第一次接触EtherCAT时,我被它的实时性能震惊了——微秒级的响应速度,完全颠覆了我对工业总线的认知。IGH_Master作为开源EtherCAT主站实现,就像是给开发者打开了一扇通往工业自动化的大门。这里我分享下自己…...
VideoAgentTrek-ScreenFilter效果展示:Zoom/Teams会议窗口自动边界检测
VideoAgentTrek-ScreenFilter效果展示:Zoom/Teams会议窗口自动边界检测 你有没有遇到过这样的场景?在录制线上会议、网课或者远程演示时,屏幕上同时开着好几个窗口——Zoom会议、Teams聊天、PPT演示、还有一堆浏览器标签页。后期剪辑时&…...
Changedetection.io网页监控工具:免费开源网站变更检测终极指南
Changedetection.io网页监控工具:免费开源网站变更检测终极指南 【免费下载链接】changedetection.io The best and simplest free open source website change detection, website watcher, restock monitor and notification service. Restock Monitor, change de…...
Python AI模型推理慢?3个被90%工程师忽略的代码级优化技巧,立竿见影提升3.2倍吞吐量
第一章:Python AI模型推理慢?3个被90%工程师忽略的代码级优化技巧,立竿见影提升3.2倍吞吐量避免动态类型推断导致的重复开销 Python 的动态类型在模型推理中常引发隐式类型转换和属性查找开销。尤其在循环内调用 model.forward() 时ÿ…...
3步实现专业级字幕去除:面向视频创作者的AI处理工具全指南
3步实现专业级字幕去除:面向视频创作者的AI处理工具全指南 【免费下载链接】video-subtitle-remover 基于AI的图片/视频硬字幕去除、文本水印去除,无损分辨率生成去字幕、去水印后的图片/视频文件。无需申请第三方API,本地实现。AI-based too…...
零成本体验软路由:京东云AX1800 Pro刷iStoreOS OpenWrt的完整教程(含空间扩容技巧)
京东云AX1800 Pro软路由改造全指南:从刷机到空间优化的实战手册 在智能家居和高速网络需求激增的今天,一台性能出色的路由器已成为家庭数字生活的核心枢纽。京东云AX1800 Pro作为一款性价比极高的Wi-Fi 6路由器,其硬件配置远超同价位产品——…...
材料科学中的缺陷与强化:如何通过控制缺陷提升材料性能?
材料科学中的缺陷与强化:如何通过控制缺陷提升材料性能? 在材料科学领域,晶体缺陷常被视为材料性能的"双刃剑"。一方面,它们可能导致材料强度降低;另一方面,精心设计的缺陷结构却能显著提升材料性…...
高数 | 【极限运算陷阱】破解未定式与直接代入的边界条件
1. 极限运算中的未定式:为什么不能直接代入? 第一次接触极限运算时,很多同学都会犯一个典型错误——看到x趋近于某个值,就直接把这个值代入函数计算。我当年学高数时也踩过这个坑,直到作业本上连续出现三个大红叉才意识…...
