C++学习笔记之右值引用以及移动构造
写在前面
右值引用,就是那些只能出于赋值号右侧的变量(目前我的理解就是没有名称的对象或值),然后对它们的引用;
移动构造,就是利用现成的对象来构造自己的新对象,而不是重新构造对象然后进行赋值操作(拷贝构造)。拷贝构造的特点就是利用已有的对象,将这个对象的值复制到新的对象中,这里其实是产生了两个对象,对吧!然而在移植构造中,新的对象就是原对象,为什么要这么做呢?这样就有利于函数传值的效率的提升。
看代码吧!!
代码实现
先看拷贝构造的消费:
#pragma once
#include <iostream>
#include <string>
class Student
{
public:
Student()
{
std::cout << "This is the constructor..." << std::endl;
}
Student(const Student& student)
{
std::cout << "This is the copy constructor..." << std::endl;
}
~Student()
{
std::cout << "This is the destructor..." << std::endl;
}
private:
std::string name;
int age;
};
#include <iostream>
#include <vector>
#include "head.h"
using namespace std;
Student test()
{
Student stu;
return stu;
}
void main()
{
vector<Student> vec;
vec.push_back(test());
}
我们来看看结果吧:
在这里,可以看到,在对象进行赋值的期间有两次对象的释放,一次是在函数里面,局部对象的释放;另外一次就是在赋值过程中,释放临时对象。所以这样做的代价还是很大的。
//接下来看看移动构造
#pragma once
#include <iostream>
#include <string>
class Student
{
public:
Student()
{
std::cout << "This is the constructor..." << std::endl;
}
Student(const Student& student)
{
std::cout << "This is the copy constructor..." << std::endl;
}
Student(const Student&& student)
{
std::cout << "This is the move constructor..." << std::endl;
}
~Student()
{
std::cout << "This is the destructor..." << std::endl;
}
private:
std::string name;
int age;
};
#include <iostream>
#include <vector>
#include "head.h"
using namespace std;
Student test()
{
Student stu;
return stu;
}
void main()
{
vector<Student> vec;
vec.push_back(test());
cout << "=============================================" << endl;
}
在这里加了一句用于移动构造的代码:
接下来再来看看上面的结果:
PS: 我这两次运行的时间间隔不超过30S,所以可以忽略系统出现任务阻塞的原因。
从这两次的运行结果中可以看出移动构造的效果确实要比拷贝构造的效果要好的多。当然前提还是你的右值的对象从此以后不再使用,否则系统会给你很多惊喜的。好了,就这样了。
不积跬步无以至千里,不积小流无以成江河。