C++11特性之右值引用


title: 右值引用與移動語義
date: 2019-2-24 15:06:34
tags: 學習
categories: 平常
---ios

什麼是右值?在C++中,一種被普遍承認的說法是,不能取地址,沒有名字的就是右值,一般位於等號右邊,相反,位於等號左邊的,能取地址,有名字的被稱爲左值。函數

a = b + c

例如上式中,a就是個左值,b+c則是右值。性能

C++11又將右值分爲純右值和將亡值。純右值包括:不跟對象關聯的字面值,一些運算表達式(如1+3)。將亡值是跟右值引用相關的表達式,好比右值引用T&&函數的返回值,std::move的返回值。學習

右值引用就是對一個右值進行引用的類型。右值引用主要是爲了移動語義,而移動語義則須要右值是能夠被更改的,這也是爲何不用常量引用。只有綁定右值的引用類型,就可以延長右值的生命期。spa

std::move的功能是將左值強制轉換爲右值引用。code

接下來看個例子:對象

#include <iostream>
using namespace std;

class HugeMem
{
  public:
    HugeMem(int size) : sz(size > 0 ? size : 1)
    {
        c = new int[sz];
    }
    ~HugeMem() { delete[] c; }
    HugeMem(HugeMem &&h) : sz(h.sz), c(h.c)
    {
        h.c = nullptr;
    }
    int sz;
    int *c;
};

class Moveable
{
  public:
    Moveable() : i(new int(3)), h(1024) {}
    ~Moveable() { delete i; }
    Moveable(Moveable &&m) : i(m.i), h(move(m.h))
    {
        m.i = nullptr;
    }
    int *i;
    HugeMem h;
};

上述代碼中,強制將m.h轉化爲右值,從而實現移動構造。對於一些簡單的,不含任何資源的的類型來講,就無需實現移動語義了。有了移動語義,能夠實現高性能的置換函數。資源

template <class T>
void swap(T &a, T &b)
{
    T tmp(move(a));
    a = move(b);
    b = move(tmp);
}
相關文章
相關標籤/搜索