C++笔记之std::move和右值引用的关系、以及移动语义

news2024/11/17 18:23:42

C++笔记之std::move和右值引用的关系、以及移动语义

code review!

文章目录

  • C++笔记之std::move和右值引用的关系、以及移动语义
    • 1.一个使用std::move的最简单C++例子
    • 2.`std::move` 和 `T&& reference_name = expression;`对比
    • 3.右值引用和常规引用的经典对比——移动语义和拷贝语义
    • 4.关于 `data = new char[size + 1];`
    • 5.std::move的使用场景列举

1.一个使用std::move的最简单C++例子

在这里插入图片描述

2.std::moveT&& reference_name = expression;对比

在这里插入图片描述

3.右值引用和常规引用的经典对比——移动语义和拷贝语义

右值引用允许我们利用移动构造函数从临时对象中“窃取”资源,避免不必要的拷贝,从而提高效率。而常规引用则会触发拷贝构造函数,产生一个新的对象副本。

在这里插入图片描述

代码

#include <iostream>
#include <string>

class MyString {
public:
    MyString(const char* str) {
        size = strlen(str);
        data = new char[size + 1];
        strcpy(data, str);
        std::cout << "Constructor: " << data << std::endl;
    }

    // 拷贝构造函数
    MyString(const MyString& other) {
        size = other.size;
        data = new char[size + 1];
        strcpy(data, other.data);
        std::cout << "Copy Constructor: " << data << std::endl;
    }

    // 移动构造函数
    MyString(MyString&& other) noexcept {
        size = other.size;
        data = other.data;
        other.size = 0;
        other.data = nullptr;
        std::cout << "Move Constructor: " << data << std::endl;
    }

    ~MyString() {
        delete[] data;
    }

    void printData() const {
        if (data)
            std::cout << "Data: " << data << std::endl;
        else
            std::cout << "Data is empty." << std::endl;
    }

private:
    size_t size;
    char* data;
};

int main() {
    MyString str1 = "Hello, World!"; // 调用构造函数
    MyString str2 = str1;            // 调用拷贝构造函数
    MyString str3 = std::move(str1); // 调用移动构造函数

    std::cout << "str1: ";
    str1.printData(); // 输出空,因为资源已被移动

    std::cout << "str2: ";
    str2.printData(); // 输出 "Hello, World!"

    std::cout << "str3: ";
    str3.printData(); // 输出 "Hello, World!"

    return 0;
}

4.关于 data = new char[size + 1];

在C++中,使用以null终止的字符串(C风格字符串)时,需要为字符串的内容分配足够的内存来存储字符,同时还需要一个额外的空间来存储字符串的null终止字符(‘\0’),表示字符串的结束。

例如,考虑字符串 “Hello”,它实际上占用了5个字符的内存,即 ‘H’、‘e’、‘l’、‘l’、‘o’,但为了使其成为一个有效的C风格字符串,需要在字符串的末尾添加一个null终止字符 ‘\0’。

因此,为了正确存储以null终止的字符串,我们需要分配的内存大小应该为字符串的长度加上一个额外的字符来存储null终止字符。这就是为什么在 data = new char[size + 1]; 语句中,使用了 size + 1 来分配足够的内存以容纳字符串内容和null终止字符。

在C++中,通过这种方式分配内存,并将字符存储在数组中,就可以实现以null终止的字符串表示。这种约定允许我们使用标准的C字符串库函数来操作和处理字符串,例如 strcpystrlen 等。

5.std::move的使用场景列举

在这里插入图片描述

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

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

相关文章

基础数学问题

目录 P1143 进制转换 P1100 高低位交换 P1866 编号 P3913 车的攻击 P3383 【模板】线性筛素数 P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题 P1572 计算分数 P4057 [Code#1] 晨跑 P2651 添加括号III P2660 zzc 种田 P1403 [AHOI2005] 约数研究 P1469 找筷子 …

未来网络的选择:100G光模块与400G光模块的对比

随着互联网的快速发展和数据传输需求的不断增长&#xff0c;光通信技术在网络领域中扮演着至关重要的角色。光模块是光通信系统中的核心组件之一&#xff0c;而100G光模块和400G光模块是目前应用广泛的两种主要类型。本文将对这两种光模块进行详细的区别对比。 一、传输速率 …

亿级短视频,如何架构?

说在前面 在尼恩的&#xff08;50&#xff09;读者社群中&#xff0c;经常指导大家面试架构&#xff0c;拿高端offer。 前几天&#xff0c;指导一个年薪100W小伙伴&#xff0c;拿到字节面试邀请。 遇到一个 非常、非常高频的一个面试题&#xff0c;但是很不好回答&#xff0…

Python3的print用法

目录 一&#xff1a;print语法 二&#xff1a;print结尾参数end用法 三&#xff1a;print分隔符参数sep用法 四&#xff1a;print固定宽度字符输出 一&#xff1a;print语法 print(*objects, sep , end\n, filesys.stdout, flushFalse) 参数解释&#xff1a; &q…

薅羊毛!Dify升级并可领400万token额度;YC 23夏季营创业团队清单;开源版妙鸭及原理揭秘;清华大模型课程 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; YC 2023年夏季营入选160创业团队&#xff0c;其中6成是AI方向 YC 2023年夏令营有160创业团队入选&#xff0c;遵从了其一贯的价值主张…

Spring AOP简单介绍

什么是AOP 面向切面编程(Aspect-Oriented Programming)是一种编程范式&#xff0c;旨在通过将横切关注点与主要业务逻辑分离&#xff0c;提供一种更好的代码组织和模块化的方式。 AOP的思想是将这些横切关注点从主要业务逻辑中抽离出来&#xff0c;形成一个独立的模块&#x…

【教程】navicat配合HTTP通道远程连接SQLite数据库

前言 &#x1f34a;缘由 好奇的我想查看服务器上宝塔面板的SQLite数据库 久别一月&#xff0c;特来水文。起因是我看到服务器上搭建的宝塔面板&#xff0c;好奇其中使用的SQLite数据库&#xff0c;想用navicat远程连接看一下&#xff0c;奈何不会玩&#xff0c;特来写一篇文…

java语言B/S架构云HIS医院信息系统源码【springboot】

医院云HIS全称为基于云计算的医疗卫生信息系统( Cloud- Based Healthcare Information System)&#xff0c;是运用云计算、大数据、物联网等新兴信息技术&#xff0c;按照现代医疗卫生管理要求&#xff0c;在一定区域范围内以数字化形式提供医疗卫生行业数据收集、存储、传递、…

使用async/await并不会执行接下来的代码,原因及解决办法

我的错误代码如下&#xff1a; async mounted() {await this.get_table_header()console.log(finish) }get_table_header(click) {const params {project_id: this.projectId,version_id: this.versionId}return new Promise((resolve, reject) > {get_table_header_setti…

基于STM32标准库智能风扇设计

目录 一&#xff0c;前言 二&#xff0c;系统方案选择 三&#xff0c;实体展示 工程分类 四&#xff0c;相关代码 PWM.c PWM.h AD.c AD.h 电机驱动程序 舵机驱动 一&#xff0c;前言 当今生活中&#xff0c;风扇已成为人们解暑的重要工具&#xff0c;然而使用风扇缓解…

一文读懂结构型模式----组合模式!

一、组合模式 1.组合模式的概述 1.1 组合模式是什么 组合模式是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象&#xff0c;用来表示部分以及整体层次。 三要素&#xff1a; 根节点(root)&#xff1a;在一棵非空的树中只有一个根节点&#xff0…

【深度学习-图像识别】使用fastai对Caltech101数据集进行图像多分类(50行以内的代码就可达到很高准确率)

文章目录 前言fastai介绍数据集介绍 一、环境准备二、数据集处理1.数据目录结构2.导入依赖项2.读入数据3.模型构建3.1 寻找合适的学习率3.2 模型调优 4.模型保存与应用 总结人工智能-图像识别 系列文章目录 前言 fastai介绍 fastai 是一个深度学习库&#xff0c;它为从业人员…

PyTorch学习笔记(十五)——完整的模型训练套路

以 CIFAR10 数据集为例&#xff0c;分类问题&#xff08;10分类&#xff09; model.py import torch from torch import nn# 搭建神经网络 class MyNN(nn.Module):def __init__(self):super(MyNN, self).__init__()self.model nn.Sequential(nn.Conv2d(3, 32, 5, 1, 2),nn.Ma…

C语言:深度学习知识储备

目录 数据类型 每种类型的大小是多少呢&#xff1f; 变量 变量的命名&#xff1a; 变量的分类&#xff1a; 变量的作用域和生命周期 作用域&#xff1a; 生命周期&#xff1a; 常量 字符串转义字符注释 字符串&#xff1a; 转义字符 操作符&#xff1a; 算术操作符…

nginx反向代理、负载均衡

修改nginx.conf的配置 upstream nginx_boot{# 30s内检查心跳发送两次包&#xff0c;未回复就代表该机器宕机&#xff0c;请求分发权重比为1:2server 192.168.87.143 weight100 max_fails2 fail_timeout30s; server 192.168.87.1 weight200 max_fails2 fail_timeout30s;# 这里的…

【流程引擎】--Camunda基础及sprringboot简单集成Camunda

目录 一、前言二、Camunda基本介绍2.1、camunda基础--符号表示2.2、camunda基础--网关表示2.3、camunda基础--事件表示 三、springboot集成Camunda四、后续 一、前言 目前市场上有常见的流程引擎&#xff1a;JBPM、Activiti、Camunda、Flowable、CompileFlow。它们的发展史如下…

TR 已经释放 task未释放的问题

货铺QQ群号&#xff1a;834508274 微信群不能扫码进了&#xff0c;可以加我微信SAPliumeng拉进群&#xff0c;申请时请提供您哪个模块顾问&#xff0c;否则是一律不通过的。 进群统一修改群名片&#xff0c;例如BJ_ABAP_森林木。群内禁止发广告及其他一切无关链接&#xff0c;小…

16-案例-记账单

功能需求: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> &l…

224、仿真-基于51单片机音乐播放器流水灯控制Proteus仿真设计(程序+Proteus仿真+原理图+程序流程图+元器件清单+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、原理图 五、程序源码 资料包括&#xff1a; 需要完整的资料可以点击下面的名片加下我&#xff0c;找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选…

C++音乐播放系统

C音乐播放系统 音乐的好处c发出声音乐谱与赫兹对照把歌打到c上 学习c的同学们都知道&#xff0c;c是一个一本正经的编程语言&#xff0c;因该没有人用它来做游戏、做病毒、做…做…做音乐播放系统吧&#xff01;&#xff01; 音乐的好处 提升情绪&#xff1a;音乐能够影响我们…