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&…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释
以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下: 前言 Module Federation 的Webpack.config.js核心配置包括: name filename(定义应用标识) remotes(引用远程模块࿰…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...
渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用
阻止除自定义标签之外的所有标签 先输入一些标签测试,说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时(如通过点击或键盘导航&…...
【工具教程】多个条形码识别用条码内容对图片重命名,批量PDF条形码识别后用条码内容批量改名,使用教程及注意事项
一、条形码识别改名使用教程 打开软件并选择处理模式:打开软件后,根据要处理的文件类型,选择 “图片识别模式” 或 “PDF 识别模式”。如果是处理包含条形码的 PDF 文件,就选择 “PDF 识别模式”;若是处理图片文件&…...
