C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C++ move使用

C++中move的使用及说明

作者:昔拉天使

这篇文章主要介绍了C++中move的使用及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

C++ move使用

move作用主要可以将一个左值转换成右值引用,从而可以调用C++11右值引用的拷贝构造函数,在对象拷贝的时候,在运行时,它们不会产生一行代码原先的对象也会清空, 可以减少资源创建和释放。

作为可以归纳为以下几点

1、std::move函数可以以非常简单的方式将左值引用转换为右值引用。

2、通过std::move,可以避免不必要的拷贝操作。

3、std::move是为性能而生。

4、std::move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝。

两个地址是独立的,move操作实际上是系统将这一块地址属于哪一个地址的登记改一下,实际上这一块内存根本没有发生任何变化。

打个比方,就好比说一个房产,原来登记在张三名下,“张三”就是地址。张三也有管理权。move就相当于过户。过户给李四后,“李四”就是这个房子的“地址”,管理权自然也交接给了李四。

C++move函数详解

C++11的一个最重要特性就是支持移动语义,其中一个比较关键的函数就是 std::move 那这个函数的作用是什么?

首先打开库文件 找到move的定义:

注意:不要把&&理解成引用的引用,这就是一个关键字

大概函数如下:

template<class T>
remove_reference_t<T>&& move(T && a) noexcept
{
	return static_cast<remove_reference_t<T>&&>(arg);
}

说白了这个函数的作用就是把传进来的参数强制转换成右值引用

可能有些人会有疑问,

为什么参数已经是右值引用了?

这就要说到参数推导了比如以下例子:

template<typename T>
void foo(T&& params);

如果传进来的是一个左值

int a = 10;
foo(a);

此时params被推导为int& 如果传进来的是一个右值

foo(20);

此时paramas被推导为int&&

remove_reference的作用是什么?

就是去掉引用,比如int& 变成int int&&变成 int

也就是说std::move把你传进来的参数所有的引用都去掉,然后在加上&&,也就是变成右值引用

remove_reference是怎么实现的?

非常简单,首先看看定义:

可以看到有了三个模板匹配,不管你传的是什么,我都能去掉你的引用,通过::type得到你原始的类型

其中remove_referenct_t 无非是一个方便的写法 typename是为了说明 remove_reference是一个class

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文