最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++移動(dòng)語(yǔ)義介紹與使用講解

 更新時(shí)間:2022年09月01日 09:38:50   作者:憤怒的小黃鴨  
首先,移動(dòng)語(yǔ)義和完美轉(zhuǎn)發(fā)這兩個(gè)概念是在C++的模板編程的基礎(chǔ)上,新增的特性,主要是配合模板來使用。本篇會(huì)從C++的值類型,到移動(dòng)拷貝與移動(dòng)賦值來理解移動(dòng)語(yǔ)義與完美轉(zhuǎn)發(fā)

引入移動(dòng)語(yǔ)義

為了能夠理解移動(dòng)語(yǔ)義的目的,我們先從整成的一個(gè)類進(jìn)行示范,示例如下:

class TestClass
{
public:
    TestClass(int s) :m_number(s) {
        cout << "constructor!\n";
    }
    ~TestClass() {
        cout << "destructor!\n";
    }
    // 拷貝構(gòu)造
    TestClass(const TestClass& that) :m_number(that.m_number) {
        cout << "copy constructor!\n";
    }
    // 賦值操作符
    TestClass& operator=(const TestClass& tc) {
        cout << "operator= is called\n";
        if (this == &tc)
            return *this;
        m_number = 0;
        m_number = tc.m_number;
        return *this;
    }
    int m_number;
};
TestClass tcFactory()
{
    TestClass tc(10);
    return tc;
}
int main()
{
    {
        TestClass tc = tcFactory();
    }
    return 0;
}

上面代碼的輸出結(jié)果如下:

constructor!
copy constructor!
destructor!
destructor!

可以看到進(jìn)行了一次構(gòu)造和一次拷貝構(gòu)造,拷貝構(gòu)造就發(fā)生在tc 接收tcFactory()返回值時(shí)。這幾產(chǎn)生了不必要的資源消耗,如果這里可以重用或者轉(zhuǎn)移return產(chǎn)生的臨時(shí)值(右值)是不是可以減少資源的消耗呢?C++正是使用轉(zhuǎn)移的方式來處理的,這個(gè)轉(zhuǎn)移就是移動(dòng)構(gòu)造函數(shù),也可以說是移動(dòng)語(yǔ)義,示例如下:

// 其他代碼不變,只增加移動(dòng)構(gòu)造與移動(dòng)賦值處理函數(shù)
// 移動(dòng)構(gòu)造
TestClass(TestClass&& rr):m_number(rr.m_number) {
    // 如果這里是指針的變量的話則可以避免指針重復(fù)釋放的問題
    rr.m_number = 0;
    cout << "move constructor!\n";
}
// 移動(dòng)賦值
TestClass& operator=(TestClass&& rr) {
    cout << "move operator= is called\n";
    if (this == &rr)
        return *this;
    // 此步驟相當(dāng)于對(duì)源指針的釋放
    m_number = 0;
    m_number = rr.m_number;
    return *this;
}

添加上述代碼后,輸出結(jié)果如下:

constructor!
move constructor!
destructor!
destructor!

此時(shí)第二次調(diào)用的就是移動(dòng)構(gòu)造,這樣可以直接使用右值,避免重新申請(qǐng)空間,調(diào)用兩次析構(gòu)是因?yàn)椋R時(shí)對(duì)象是被延長(zhǎng)了聲明周期,但最終也是要釋放的。

std::move

前面看到移動(dòng)構(gòu)造接收的是右值引用,那么在需要對(duì)左值進(jìn)行移動(dòng)語(yǔ)義的時(shí)候(進(jìn)行移動(dòng)語(yǔ)義后,此左值以后將失效),那么就必須將左值轉(zhuǎn)換為右值。此時(shí)td::move就很好的完成了這件事情,示例如下:

int main()
{
    vector<int> v{ 1,2,3,4 };
    // 拷貝構(gòu)造
    vector<int> v1 = v;
    // 移動(dòng)構(gòu)造
    vector<int> v2 = std::move(v);
    cout << "v size():" << v.size() << "\n";
    cout << "v2 size():" << v2.size() << "\n";
    return 0;
}

上面輸出代碼為:

v size():0
v2 size():4

關(guān)于std::move注意的幾點(diǎn):

std::move本質(zhì)上只是將傳入的參數(shù)轉(zhuǎn)換為一個(gè)右值,使用static_cast進(jìn)行轉(zhuǎn)換

std::move在進(jìn)行類型推導(dǎo)時(shí)會(huì)保留形參的const屬性,此時(shí)會(huì)造成一種使用失效的場(chǎng)景如下:

class TestClass
{
public:
	// 這么寫在 VS中也會(huì)提示 	C26478 不要對(duì)常量變量使用 std::move
    TestClass(const string& str) :m_str(std::move(str)) {
    }
    string m_str;
};
int main()
{
    string str = "sss";
    TestClass tc(str);
    cout << tc.m_str << "\n";
    // 此處應(yīng)該輸出空,但實(shí)際并非如此 , 兩個(gè)輸出都是 sss
    cout << str << "\n";
    return 0;
}

到此這篇關(guān)于C++移動(dòng)語(yǔ)義介紹與使用講解的文章就介紹到這了,更多相關(guān)C++移動(dòng)語(yǔ)義內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++編譯器無法捕捉到的8種錯(cuò)誤實(shí)例分析

    C++編譯器無法捕捉到的8種錯(cuò)誤實(shí)例分析

    這篇文章主要介紹了C++編譯器無法捕捉到的8種錯(cuò)誤,是深入學(xué)習(xí)C++所必須加以掌握的排錯(cuò)技能,需要的朋友可以參考下
    2014-09-09
  • CLion安裝、漢化、配置圖文詳解

    CLion安裝、漢化、配置圖文詳解

    這篇文章主要介紹了CLion安裝、漢化、激活、配置圖文詳解,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 深入sizeof的使用詳解

    深入sizeof的使用詳解

    本篇文章是對(duì)sizeof的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++深入分析回顧函數(shù)重載

    C++深入分析回顧函數(shù)重載

    C++ 允許多個(gè)函數(shù)擁有相同的名字,只要它們的參數(shù)列表不同就可以,這就是函數(shù)的重載(Function Overloading),借助重載,一個(gè)函數(shù)名可以有多種用途
    2022-06-06
  • C++ 實(shí)現(xiàn)自定義類型的迭代器操作

    C++ 實(shí)現(xiàn)自定義類型的迭代器操作

    這篇文章主要介紹了C++ 實(shí)現(xiàn)自定義類型的迭代器操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Opencv光流運(yùn)動(dòng)物體追蹤詳解

    Opencv光流運(yùn)動(dòng)物體追蹤詳解

    這篇文章主要為大家詳細(xì)介紹了Opencv光流運(yùn)動(dòng)物體追蹤的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 一起來了解一下C++中的指針

    一起來了解一下C++中的指針

    這篇文章主要為大家詳細(xì)介紹了C++的指針,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C語(yǔ)言實(shí)現(xiàn)密碼本小項(xiàng)目

    C語(yǔ)言實(shí)現(xiàn)密碼本小項(xiàng)目

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)密碼本小項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • c語(yǔ)言 字符串轉(zhuǎn)大寫的簡(jiǎn)單實(shí)例

    c語(yǔ)言 字符串轉(zhuǎn)大寫的簡(jiǎn)單實(shí)例

    這篇文章主要介紹了c語(yǔ)言 字符串轉(zhuǎn)大寫的簡(jiǎn)單實(shí)例,有需要的朋友可以參考一下
    2013-12-12
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易連連看游戲

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易連連看游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易連連看游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09

最新評(píng)論

富顺县| 确山县| 临沧市| 桂东县| 汉沽区| 抚顺县| 甘肃省| 永丰县| 郯城县| 信宜市| 桦川县| 曲周县| 沙坪坝区| 陆河县| 栾川县| 湘乡市| 焦作市| 海淀区| 治县。| 丰原市| 东海县| 辽宁省| 咸丰县| 仪征市| 宁都县| 称多县| 云南省| 临泉县| 苍南县| 西乌珠穆沁旗| 农安县| 杭州市| 樟树市| 察隅县| 治多县| 安顺市| 吉隆县| 泾川县| 咸宁市| 内乡县| 恩施市|