当前位置: 首页 > 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减小内存开销,提高性能;

相关文章:

  • @Transactional注解失效的原因有哪些?
  • 如何对Video视频进行SEO优化?
  • OLED(SSD306)移植全解-基于IIC
  • Semaphore - 信号量
  • CPP基础
  • 西门子 S7-1200 PLC 海外远程运维技术方案
  • DAX权威指南8:DAX引擎与存储优化
  • 第七章:未名湖畔的樱花网关
  • 书籍推荐 --- 《筚路维艰:中国经济社会主义路径的五次选择》
  • 【信息系统项目管理师-案例真题】2025上半年(第二批)案例分析答案和详解(回忆版)
  • ​​Java 异常处理​​ 的详细说明及示例,涵盖 try-catch-finally、自定义异常、throws 与 throw 的核心概念和使用场景
  • 在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
  • Benchmarking Potential Based Rewards for Learning Humanoid Locomotion
  • 关于锁策略的简单介绍
  • 固态继电器与驱动隔离器:电力系统的守护者
  • C++.OpenGL (6/64)坐标系统(Coordinate Systems)
  • 为什么要对邮件列表清洗?
  • C++ --- vector
  • 深入理解指针(二)
  • [蓝桥杯]整理玩具
  • 广州网站建设是什么/seo网络推广公司
  • o2o电商网站开发/b站视频推广网站2023年
  • 外贸英文网站制作/小说推广接单平台
  • 做新媒体每天必看的网站/专门搜索知乎内容的搜索引擎
  • 做微电网的公司网站/seo短视频入口引流
  • 营销网站建设流程/奶茶店推广软文500字