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

C++中的右值引用与移动语义的理解

C++中的右值引用与移动语义的理解

从三个层面出发,什么是右值引用和移动语义;为什么需要右值引用和移动语义、std::move作用

一、什么是右值引用与移动语义

右值引用:C++中定义的对右值的引用

int && a = 5; // 这里a的地址就是这个语句中5的地址
int b = 5; // 这里b的地址和这个语句中5这个临时变量

在这里插入图片描述

**移动语义:**对于含有指针类型作为成员数据的类,使用移动而不是深拷贝进行初始化或者赋值。具体体现就是类的移动构造函数和移动赋值函数;也就是传入一个右值引用(就相当于给这个临时变量),然后让本对象的指针的值直接等于该临时对象指针的值,然后将临时对象的指针再置为空。这样避免了深拷贝那样的内存开销。

二、为什么需要右值引用和移动语义

为了避免像深拷贝操作那样的内存开销。比如现在我有一个类,其定义如下:

class T{char* s; //字符串
public:T(){s=nullptr;}T(const char* s){this->s = new char[strlen(s)+1]; //新分配内存strcpy(this->s, s); //为新分配内存赋值}// 拷贝构造函数T(const T & t){this->s = new char[strlen(t.s)+1]; //新分配内存strcpy(this->s, t.s); //为新分配内存赋值}// 移动构造函数T(T && t){this->s = t.s;t.s = nullptr;}
};

对于T t(T("ikun2")); 语句,没有移动构造函数的话,会调用深拷贝构造函数T(const T & t),会新分配内存。但是如果有移动构造函数的话,该语句会调用移动构造函数,就不会进行新分配内存的操作。

三、std::move

std::move用于将一个对象转为右值引用。相当于告诉编译器这个对象我后续不会再使用,你可以把这个对象占用的内存给分配掉。

void Tensor<float>::Padding(const std::vector<uint32_t>& pads,float padding_value) {CHECK(!this->data_.empty());CHECK_EQ(pads.size(), 4);// 四周填充的维度uint32_t pad_rows1 = pads.at(0);  // upuint32_t pad_rows2 = pads.at(1);  // bottomuint32_t pad_cols1 = pads.at(2);  // leftuint32_t pad_cols2 = pads.at(3);  // right// 请补充代码arma::fcube new_data(pad_rows1+pad_rows2+this->data_.n_rows, pad_cols1+pad_cols2+this->data_.n_cols, this->data_.n_slices);new_data.fill(padding_value);new_data.subcube(pad_rows1, pad_cols1, 0,pad_rows1+this->data_.n_rows-1, pad_cols1+this->data_.n_cols-1,this->data_.n_slices-1)=this->data_;this->data_ = std::move(new_data);
}

比如这个函数最后使用this->data_ = std::move(new_data);因为new_data后续不会再被用到,且为了this->data不用再重新分配内存来接收new_data的值,所以使用std::move减小内存开销,提高性能;

http://www.xdnf.cn/news/914347.html

相关文章:

  • 思维链的 内部机制和简单理解
  • 【Unity Shader编程】之让画面动起来
  • Qwen2.5-VL - 模型结构
  • 如何使用 Bulk Rename Utility 批量为文件名添加统一后缀?
  • 今日行情明日机会——20250606
  • 如何防止误删除rm (万恶之源)
  • 功率估计和功率降低方法指南(3~5)
  • 光耦合器:隐形守护者,拓展无限应用
  • Python内置函数ord()详解
  • 为什么要对邮件列表清洗?
  • 美国大休斯顿都会区电网数据
  • 云服务器中容灾模式的主要用途都有哪些?
  • PDF文件如何转换格式?简单教程来了
  • SAP ABAP LOOP GROUP BY 分组循环的使用方法
  • 独家首发!低照度环境下YOLOv8的增强方案——从理论到TensorRT部署
  • 概念理解篇:线程同步之【互斥】
  • PyQt6 GUI应用程序开发实操指南
  • 布林波动率策略
  • 算法学习之——LRU最近最少使用
  • 告别数据泥沼,拥抱智能中枢:King’s四位一体重塑科研生产力
  • 负载均衡器 LB》》
  • ABB输入/输出系统- S800输入/输出AI830A
  • 场景题-3
  • 【Linux】sed 命令详解及使用样例:流式文本编辑器
  • 【网页端数字人开发】基于模型SAiD实现嘴型同步
  • 三模冗余设计
  • 书籍推荐 --- 《筚路维艰:中国经济社会主义路径的五次选择》
  • 瑞它鲁肽 Retatrutide
  • Delphi 实现远程连接 Access 数据库的指南
  • 为什么HDI叠孔比错孔设计难生产