欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++右值引用與move和forward函數(shù)的使用詳解

 更新時間:2022年08月19日 15:28:44   作者:Maxwell..  
為了支持移動操作,新標(biāo)準(zhǔn)引入了一種新的引用類型——右值引用(rvalue reference)。所謂右值引用就是必須綁定到右值的引用,這篇文章主要介紹了C++右值引用與move和forward的使用

1、右值

1.1 簡介

首先區(qū)分一下左右值:

  • 左值是指存儲在內(nèi)存中、有明確存儲地址(可取地址)的數(shù)據(jù);
  • 右值是指可以提供數(shù)據(jù)值的數(shù)據(jù)(不可取地址)

如int a=123;123是右值, a是左值。總的來說 可以對表達(dá)式取地址(&)就是左值,否則為右值

而C++11 中右值又可以分為兩種:

  • 純右值:非引用返回的臨時變量、運(yùn)算表達(dá)式產(chǎn)生的臨時變量如a+b、原始字面量和 lambda 表達(dá)式等
  • 將亡值:與右值引用相關(guān)的表達(dá)式、返回T&& 類型函數(shù)的返回值

1.2 右值引用

常見的 & 為左值引用、右值引用使用 && 表示

int&& a = 123;
int &b = a;
int &&c = a;//不合法

如上 a 是對123的右值引用,但是a本身是左值,其在內(nèi)存中有明確的存儲地址,所以c不能再對其進(jìn)行左值引用。

1.3 右值引用的意義

可以將資源(堆、系統(tǒng)對象等)通過淺拷貝從一個對象轉(zhuǎn)移到另一個對象這樣就能減少不必要的臨時對象的創(chuàng)建、拷貝以及銷毀,可以大幅提高應(yīng)用程序的性能。

#include <iostream>
using namespace std;
class Test
{
public:
    Test() : num(new int(100))
    {
        cout << "construct" << endl;
    }
    Test(const Test& a) : num(new int(*a.num))
    {
        cout << "copy construct" << endl;
    }
    // 移動構(gòu)造函數(shù)其實就是將入?yún)⒌馁Y源賦值給自己,并將入?yún)⒌膶?yīng)資源指針制空,
    Test(Test&& a) : num(a.num)
    {
        cout << "rv copy construct" << endl;
        a.num = nullptr;
    }
    ~Test()
    {
        delete num;
    }
    int* num;
};
Test getObj()
{
    Test t;
    return t;
}
int main()
{
    Test t = getObj();
    return 0;
};

getObj()會得到一個非引用的臨時對象,是純右值,如果只有拷貝構(gòu)造函數(shù)就只能再次new一塊區(qū)域去保存該右值的資源,這是因為不能確定拷貝構(gòu)造傳入的參數(shù)后面是不是還會繼續(xù)被使用, 只好進(jìn)行深拷貝。而對于傳入右值的情況,可以確定右值以后不會再進(jìn)行訪問,因此可直接將其指針復(fù)給新對象,將入?yún)⒌膶?yīng)指針置為null,防止析構(gòu)造成野指針,避免深拷貝帶來的性能消耗。

由此可見,右值引用具有移動語義:將確定后續(xù)不再使用的對象中的資源轉(zhuǎn)移給新的對象,雖然左值引用也能夠做到資源轉(zhuǎn)移,但傳入的左值后續(xù)可能還會被更改和使用,個人認(rèn)為右值引用恰好做到了這種區(qū)分。

2、move

使用std::move方法可以將左值轉(zhuǎn)換為右值。使用這個函數(shù)并不能移動任何東西,而是和移動構(gòu)造函數(shù)一樣都具有移動語義,將對象的狀態(tài)或者所有權(quán)從一個對象轉(zhuǎn)移到另一個對象,只是轉(zhuǎn)移,沒有內(nèi)存拷貝。

當(dāng)確定一個變量a后續(xù)不會再進(jìn)行使用,并且需要將其賦值給另一個對象時,可以使用移動構(gòu)造來轉(zhuǎn)移資源

Test a;

Test && b = a; // error

上面的操作是不可行的,因為a不是一個右值,要想調(diào)用Test的移動構(gòu)造函數(shù),就必須將a這個左值轉(zhuǎn)變?yōu)橐粋€右值:使用move() 函數(shù)

Test a;

Test && b = move(a); // ok

std::move 基本等同于一個類型轉(zhuǎn)換:

static_cast<T&&>(lvalue)

3、foward

move將左值轉(zhuǎn)換為右值,foward可以滿足更多的情形

std::forward<T>(t);

  • 當(dāng)T為左值引用類型時,t將被轉(zhuǎn)換為T類型的左值
  • 當(dāng)T不是左值引用類型時,t將被轉(zhuǎn)換為T類型的右值

int a = 123;

foward<int&>(a); // a轉(zhuǎn)換為左值并返回

foward<int&&>(a); // a轉(zhuǎn)換為右值并返回

foward<int>(a); // a轉(zhuǎn)換為右值并返回

到此這篇關(guān)于C++右值引用與move和forward函數(shù)的使用詳解的文章就介紹到這了,更多相關(guān)C++右值引用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于UDP服務(wù)器客戶端編程流程介紹

    關(guān)于UDP服務(wù)器客戶端編程流程介紹

    大家好,本篇文章主要講的是關(guān)于UDP服務(wù)器客戶端編程流程介紹,感興趣的同學(xué)趕快來看看吧,對你有幫助的話記得收藏
    2021-12-12
  • C語言模擬實現(xiàn)簡單掃雷游戲

    C語言模擬實現(xiàn)簡單掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C語言模擬實現(xiàn)簡單掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • C語言詳細(xì)分析宏定義與預(yù)處理命令的應(yīng)用

    C語言詳細(xì)分析宏定義與預(yù)處理命令的應(yīng)用

    宏定義是用宏名來表示一個字符串,在宏展開時又以該字符串取代宏名,這只是一種簡單的替換。字符串中可以含任何字符,可以是常數(shù),也可以是表達(dá)式,預(yù)處理程序?qū)λ蛔魅魏螜z查,如有錯誤,只能在編譯已被宏展開后的源程序時發(fā)現(xiàn)
    2022-07-07
  • C++實現(xiàn)不能被繼承的類實例分析

    C++實現(xiàn)不能被繼承的類實例分析

    這篇文章主要介紹了C++實現(xiàn)不能被繼承的類實例分析,對于C++初學(xué)者而言可以通過本文實例更好的理解類的原理及運(yùn)用,需要的朋友可以參考下
    2014-08-08
  • 詳解C++之類和對象(1)

    詳解C++之類和對象(1)

    類是創(chuàng)建對象的模板,一個類可以創(chuàng)建多個對象,每個對象都是類類型的一個變量;創(chuàng)建對象的過程也叫類的實例化。每個對象都是類的一個具體實例(Instance),擁有類的成員變量和成員函數(shù)
    2021-11-11
  • C語言指針詳解之野指針

    C語言指針詳解之野指針

    這篇文章主要為大家介紹了C語言野指針,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • c語言中enum類型的用法案例講解

    c語言中enum類型的用法案例講解

    這篇文章主要介紹了c語言中enum類型的用法案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是本文的詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 淺談C++類型轉(zhuǎn)化(運(yùn)算符重載函數(shù))和基本運(yùn)算符重載(自增自減)

    淺談C++類型轉(zhuǎn)化(運(yùn)算符重載函數(shù))和基本運(yùn)算符重載(自增自減)

    下面小編就為大家?guī)硪黄獪\談C++類型轉(zhuǎn)化(運(yùn)算符重載函數(shù))和基本運(yùn)算符重載(自增自減)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • C++設(shè)計模式編程中proxy代理模式的使用實例

    C++設(shè)計模式編程中proxy代理模式的使用實例

    這篇文章主要介紹了C++設(shè)計模式編程中proxy代理模式的使用實例解析,代理模式可以被歸類為結(jié)構(gòu)型的設(shè)計模式,代理模式主張為對象提供一種代理以控制對這個對象的訪問,需要的朋友可以參考下
    2016-03-03
  • C++內(nèi)嵌匯編示例詳解

    C++內(nèi)嵌匯編示例詳解

    這篇文章主要介紹了C++內(nèi)嵌匯編,本文的所有代碼是在我自己的VS2008中測試的,由于環(huán)境的差別,不能保證能在所有的編譯器上運(yùn)行,需要的朋友可以參考下
    2022-01-01

最新評論