C++中的move特性

C++ 11中出现了move函数,自己平时几乎没使用过,不过看很多源码都有move的使用,而且在看《代码整洁之道》《c++性能优化指南》等书籍的时候都对该函数有推荐,不过这其中涉及到了其他的知识,比如左值,右值得概念,所以一直也没空对其进行梳理总结,下面是一点自己看书的理解:

  1. std::move()是什么?
    std::move()学术上是一个函数,其实实际不是一函数,它只是传话筒,告诉编译器一个左值可以被“劫掠”啦。
  2. std::move()能做什么?
    它只是传话筒,告诉编译器一个左值可以被“劫掠”啦,换句话说就是告诉编译器“现在你可以毁灭我了,拿走我的所有内存呀什么的”
    string str = "hello";
    std::move(x);//不会有任何效果,因为编译器并没有摧毁,因为没有找到一个接盘侠
    cout << str << endl;//show "hello"
    string robber = std::move(x);//找到了一个强盗接盘
    cout << str << endl;//show " "
    cout << robber<< endl;//show "hello"
    
  3. std::move()什么时候使用?
    例子:
    template <class T>
    swap(T& a, T& b) 
    {
        T tmp(a);   // we now have two copies of a
        a = b;      // we now have two copies of b (+ discarded a copy of a)
        b = tmp;    // we now have two copies of tmp (+ discarded a copy of b)
    }
    template <class T>
    swap(T& a, T& b) 
    {
        T tmp(std::move(a));
        a = std::move(b);   
        b = std::move(tmp);
    }
    
    此外常用在STL中,常见的是push_back(std::move(str))

下面是一专业术语的解释:
左值:可以取地址,有名字的就是左值
右值:反之
举个例子,int a = b+c, a 就是左值,其有变量名为a,通过&a可以获取该变量的地址;表达式b+c、函数int func()的返回值是右值,在其被赋值给某一变量前,我们不能通过变量名找到它,&(b+c)这样的操作则不会通过编译。
将亡值:将亡值可以理解为通过“盗取”其他变量内存空间的方式获取到的值。比如返回右值引用T&&的函数返回值、std::move的返回值,或者转换为T&&的类型转换函数的返回值。
注意

  • 右值引用变量, 在表达式中使用时会变成左值(参考上面代码的最后几行);
  • 一个函数接受右值引用作为参数, 在函数中会变成左值引用(所以才要实现完美转发).

void f(int& x) { cout << "1" << endl; }

void f(const int& x) { cout << "2" << endl; }

void f(int&& x) { cout << "3" << endl; }

int main() {
    int i = 1;
    const int ci = 2;
    f(i);  // calls f(int&)
    f(ci); // calls f(const int&)
    f(3);  // calls f(int&&)
           // would call f(const int&) if f(int&&) overload wasn't provided
    f(std::move(i)); // calls f(int&&)

    // rvalue reference variables are lvalues when used in expressions
    int&& x = 1;
    f(x);            // calls f(int& x)
    f(std::move(x)); // calls f(int&& x)
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值