百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

彻底理解且用对移动语义std:move()

ztj100 2025-01-21 23:13 18 浏览 0 评论

c++中移动语义std:move()定义:

template <class T>
typename remove_reference<T>::type&& move (T&& arg) noexcept {
    return static_cast<remove_reference<decltype(arg)>::type&&>(arg);
}
  1. 作用:将左值转为右值引用。
  2. 使用场景:将不再继续使用的左值继续用在其它方面,以节省内存开销和对象拷贝开销。
  3. 原理理解:

Many components of the standard library implement move semantics, allowing to transfer ownership of the assets and properties of an object directly without having to copy them when the argument is an rvalue.

翻译:许多标准库组件实现了移动语义,当对象是一个右值时,在不拷贝对象的情况下转移这个对象的资源和属性的拥有权。

理解:

(1) 这个对象必须是一个右值;

(2) 不用拷贝对象;

(3) 是转移的对象资源的拥有权,如图1。


Although note that -in the standard library- moving implies that the moved-from object is left in a valid but unspecified state. Which means that, after such an operation, the value of the moved-from object should only be destroyed or assigned a new value; accessing it otherwise yields an unspecified value.

翻译:尽管如此,在标准库里,移动语义说明被移动的对象处于有效但未指定的状态。也就是说,在std::move()执行后,被移动的对象的值应当被销毁或者赋予一个新值;访问这个被移动的对象会出现一个不确定的值。

理解:

(1) 对象经过std::move()执行后,处于有效但未指定的状态。

"有效但未指定"的理解:

如:Student stu2 = std::move(stu1); stu1是一个有效的声明,但是stu1里的值是不确定的。

4.实现原理。

如下代码,实现原理是:

(1)类中声明移动构造函数;

(2)std::move()将左值转为右值再调用时,就会调用移动构造函数;

(3)移动构造函数实现了两个功能点:a.数据初始化,2.销毁被移动对象数据。

class Info {
public:
  Info():age(0){}
  Info(int age):age(age){}
  int age;
};

class Student {
public:
  Student() : info(nullptr) {}
  Student(const Student& stu) { //拷贝构造函数
    cout << "constructor" << endl;
  }
  Student(Student&& stu) noexcept : info(stu.info) { //移动构造函数
    stu.info = nullptr;
    cout << "Move constructor" << endl;
  }
  ~Student() {};
  Info* info;
};

int main(){
  Student stu;
  stu.info = new Info(20);
  Student stu1(stu);  //调用拷贝构造函数
  cout << stu.info->age << endl;
  Student stu2(std::move(stu)); //调用移动构造函数
  cout << stu2.info->age << endl;
  return 0;
}
输出:
constructor
20
Move constructor
20


5.误用

(1)任何场景都用std::move(),但是其实是需要类中实现了移动语义功能才行(移动构造函数+数据初始化+销毁被移动对象数据)

int a = 100;
int b = std::move(a); //这样是不对的,这样依然进行了拷贝。

6.思考

需要透彻理解std::move(),还是需要根据其定义、原理,且结合实践代码理解,不实践写代码去实现移动语义是很难透彻理解的。

相关推荐

再说圆的面积-蒙特卡洛(蒙特卡洛方法求圆周率的matlab程序)

在微积分-圆的面积和周长(1)介绍微积分方法求解圆的面积,本文使用蒙特卡洛方法求解圆面积。...

python编程:如何使用python代码绘制出哪些常见的机器学习图像?

专栏推荐...

python创建分类器小结(pytorch分类数据集创建)

简介:分类是指利用数据的特性将其分成若干类型的过程。监督学习分类器就是用带标记的训练数据建立一个模型,然后对未知数据进行分类。...

matplotlib——绘制散点图(matplotlib散点图颜色和图例)

绘制散点图不同条件(维度)之间的内在关联关系观察数据的离散聚合程度...

python实现实时绘制数据(python如何绘制)

方法一importmatplotlib.pyplotaspltimportnumpyasnpimporttimefrommathimport*plt.ion()#...

简单学Python——matplotlib库3——绘制散点图

前面我们学习了用matplotlib绘制折线图,今天我们学习绘制散点图。其实简单的散点图与折线图的语法基本相同,只是作图函数由plot()变成了scatter()。下面就绘制一个散点图:import...

数据分析-相关性分析可视化(相关性分析数据处理)

前面介绍了相关性分析的原理、流程和常用的皮尔逊相关系数和斯皮尔曼相关系数,具体可以参考...

免费Python机器学习课程一:线性回归算法

学习线性回归的概念并从头开始在python中开发完整的线性回归算法最基本的机器学习算法必须是具有单个变量的线性回归算法。如今,可用的高级机器学习算法,库和技术如此之多,以至于线性回归似乎并不重要。但是...

用Python进行机器学习(2)之逻辑回归

前面介绍了线性回归,本次介绍的是逻辑回归。逻辑回归虽然名字里面带有“回归”两个字,但是它是一种分类算法,通常用于解决二分类问题,比如某个邮件是否是广告邮件,比如某个评价是否为正向的评价。逻辑回归也可以...

【Python机器学习系列】拟合和回归傻傻分不清?一文带你彻底搞懂

一、拟合和回归的区别拟合...

推荐2个十分好用的pandas数据探索分析神器

作者:俊欣来源:关于数据分析与可视化...

向量数据库:解锁大模型记忆的关键!选型指南+实战案例全解析

本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在...

用Python进行机器学习(11)-主成分分析PCA

我们在机器学习中有时候需要处理很多个参数,但是这些参数有时候彼此之间是有着各种关系的,这个时候我们就会想:是否可以找到一种方式来降低参数的个数呢?这就是今天我们要介绍的主成分分析,英文是Princip...

神经网络基础深度解析:从感知机到反向传播

本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在...

Python实现基于机器学习的RFM模型

CDA数据分析师出品作者:CDALevelⅠ持证人岗位:数据分析师行业:大数据...

取消回复欢迎 发表评论: