目录
- C++ move使用
- 作为可以归纳为以下几点
- C++move函数详解
- 为什么参数已经是右值引用了?
- remove_reference的作用是什么?
- remove_reference是怎么实现的?
- 总结
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); }
说白了这个函数的作用就是把传进来的参数强制转换成右值引python用
可能有些人会有疑问,
编程客栈为什么参数已经是右值引用了?
这就要说到参数推导了比如以下例子:
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是为了说明www.devze.com remove_reference是一个class
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。python
精彩评论