看了很多篇文章,现在终于搞懂了C++ 中的右值以及std::move

 
左值和右值最重要的区别就是右值其实是一个临时的变量
在C++ 11中,也为右值引用增加了新语法,即&&
 
比如如下代码:

void testFunc(int  &i )
{
std::cout<<"reference test func int"<<std::endl;
}
void testFunc( int &&i )
{
std::cout<<" Right Value test func int"<<std::endl;
}
int main() {
int j = ;
testFunc();
testFunc(int());
testFunc(j);
system("pause");
} 此时输出为:
Right Value test func int
Right Value test func int
reference test func int
 
此时有两行输出是Right Value test func int,其他的都是输出reference test func int
只要注意看这两行就会发现,在testFunc(1)的时候,我们创建了一个临时变量,在testFunc(int())的时候,我们创建了一个int()的临时变量,
此时会被编译器解析为右值,然后匹配到testFuunc(int &&i)里面
 
从这上面应该都懂得了什么是右值,什么是左值
我们可以把左值转换为右值,即为std::move
此时在上面的代码如果我们调用 testFunc( std::move(j) )的话,则会调用到testFunc( int &&i)这个函数
 
那么这个右值引用和std::move有什么用呢??
就是减少资源转移所造成的成本
在C++中,我们最经常接触的资源就是内存了,想象一下,假设一个string oldString,里面new 了1W个字节,此时我们调用了newString= oldString的时候,那么我们将会调用string &operator=(const string &other)这个函数
在string &operator=(const string &other)中,我们一般做如下动作:
1.申请1W(或者多个)字节
2.将这1W个字节复制到这新开辟的内存中
 
到目前为止都没什么问题,但是想象一下,假如我们可以肯定oldString已经不再使用了怎么办??我们还是要多申请这1W个内存吗??为什么不直接把oldString的指针直接赋值给newString呢??反正oldString已经不用了..
 
这就是增加了右值语义的原因了,这个时候我们可以定义一个函数
string &operator=(string &&other)
{
    //将other里面的指针赋值给this里面对应的变量
    //将other里面的指针赋值为nullptr                      這一步很重要,否则资源谁持有将会混乱,清理原来的资源也是编写这个函数重要的一点
}
如上面的伪代码,资源将会被移动到新的字符串中,因为是移动,不是复制,所以记得将原来的指针什么的赋值为nullptr
 
然后我们可以用move将oldString转换为右值了
newString = std::move( oldString)
此时将会调用string &operator=(string &&other),我们就少申请了1W个字节了,但是原来oldString的资源也被移动走了,这就是移动语义的真正意义

C++ 11中的右值引用以及std::move的更多相关文章

  1. C++ 11 中的右值引用

    C++ 11 中的右值引用 右值引用的功能 首先,我并不介绍什么是右值引用,而是以一个例子里来介绍一下右值引用的功能: #include <iostream>    #include &l ...

  2. [转载] C++11中的右值引用

    C++11中的右值引用 May 18, 2015 移动构造函数 C++98中的左值和右值 C++11右值引用和移动语义 强制移动语义std::move() 右值引用和右值的关系 完美转发 引用折叠推导 ...

  3. C++ 11 右值引用以及std::move

    转载请注明出处:http://blog.csdn.net/luotuo44/article/details/46779063 新类型: int和int&是什么?都是类型.int是整数类型,in ...

  4. Item 25: 对右值引用使用std::move,对universal引用则使用std::forward

    本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 右值引用只能绑定那些有资格被move的对象上去.如 ...

  5. C++11中的右值引用

    原文出处:http://kuring.me/post/cpp11_right_reference May 18, 2015 移动构造函数 C++98中的左值和右值 C++11右值引用和移动语义 强制移 ...

  6. C++11中的右值引用及move语义编程

    C++0x中加入了右值引用,和move函数.右值引用出现之前我们只能用const引用来关联临时对象(右值)(造孽的VS可以用非const引用关联临时对象,请忽略VS),所以我们不能修临时对象的内容,右 ...

  7. C++ 11 左值,右值,左值引用,右值引用,std::move, std::foward

    这篇文章要介绍的内容和标题一致,关于C++ 11中的这几个特性网上介绍的文章很多,看了一些之后想把几个比较关键的点总结记录一下,文章比较长.给出了很多代码示例,都是编译运行测试过的,希望能用这些帮助理 ...

  8. 【转载】C++ 11中的右值引用

    本篇随笔为转载,原博地址如下:http://www.cnblogs.com/TianFang/archive/2013/01/26/2878356.html 右值引用的功能 首先,我并不介绍什么是右值 ...

  9. C++11右值引用和std::move语句实例解析

    关键字:C++11,右值引用,rvalue,std::move,VS 2015 OS:Windows 10 右值引用(及其支持的Move语意和完美转发)是C++0x将要加入的最重大语言特性之一.从实践 ...

随机推荐

  1. jq中如何阻止元素的默认行为?

    阻止网页元素的默认行为: event.preventDefault(); 或者:return false;

  2. POJ 3461 裸的KMP

    直接贴代码吧 #include<cstdio> #include<cstring> ],T[]; ]; int n,m; void getfail() { f[] = ; f[ ...

  3. spark新能优化之reduceBykey和groupBykey的使用

    val counts = pairs.reduceByKey(_ + _) val counts = pairs.groupByKey().map(wordCounts => (wordCoun ...

  4. 《剑指Offer》之二维数组中的查找

    1.题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 2.代码实现 pu ...

  5. (转) Reinforcement Learning for Profit

    Reinforcement Learning for Profit July 17, 2016 Is RL being used in revenue generating systems today ...

  6. pyzmq missing when running ipython notebook

    Q: I can run iPython, but when I try to initiate a notebook I get the following error: ~ ipython not ...

  7. 自动生成XML反序列化的类

    原文地址:http://www.cnblogs.com/jaxu/p/3632077.html   Visual Sutdio 2013增加了许多新功能,其中很多都直接提高了对代码编辑的便利性.如: ...

  8. sql复制表

    SELECT INTO 和 INSERT INTO SELECT 两种表复制语句       Insert是T-sql中常用语句,Insert INTO table(field1,field2,... ...

  9. linux知识点

    通过gui来使用通过api来使用通过cli来使用通过tui来使用 进程不在,但tcp连接还一直存在的解决办法--tcpkill命令 http://www.centoscn.com/CentOS/Int ...

  10. wamp下Apache2.4.x局域网访问403的解决办法

    1.我们打开Apache目录\wamp\bin\apache\apache2.4.9下的“conf”文件夹,找到httpd.conf. 2.找到#   onlineoffline tag - don' ...