当前位置: 首页 > news >正文

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

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;elsestd::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.lryc.cn/news/132191.html

相关文章:

  • ES6自用笔记
  • 【BASH】回顾与知识点梳理(二十九)
  • Docker的Cgroup资源限制
  • AI智能语音机器人的基本业务流程
  • uniapp 上传比较大的视频文件就超时
  • CSS简介
  • 卡方分箱(chi-square)
  • 深入理解 Flutter 图片加载原理
  • 【电子通识】什么是异常分析中的A-B-A方法
  • [Linux] C获取键盘输入值
  • 探索Python编程世界:开启你的代码之旅
  • 金融术语总结
  • Linux驱动开发(Day5)
  • [机器学习]特征工程:主成分分析
  • Python爬虫实战案例——第一例
  • 一、openlayer开发介绍
  • 利用Jackson封装常用的JsonUtil工具类
  • 阿里云2核4G服务器配置汇总表_轻量和ECS
  • 攻防世界-ics-06
  • 人工智能轨道交通行业周刊-第56期(2023.8.14-8.20)
  • ruoyi-vue-pro yudao 项目报表设计器 积木报表模块启用及相关SQL脚本
  • 【第三阶段】kotlin中使用带let的安全调用
  • JavaScript 快速入门手册
  • FreeMarker系列--list的用法(长度,遍历,下标,嵌套,排序)
  • 【观察】戴尔科技:构建企业创新“韧性”,开辟数实融合新格局
  • 数据管理平台
  • 手搓大语言模型 使用jieba分词制作词表,词表大小几十万 加强依赖性
  • 【校招VIP】java语言类和对象之map、set集合
  • windows服务器下java程序健康检测及假死崩溃后自动重启应用、开机自动启动
  • 七夕特辑(一)浪漫表白方式 用神经网络生成一首情诗