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

C++11中std::move、std::forward、左右值引用、移動構造函數的測試問題

 更新時間:2020年09月08日 08:27:46   作者:huik  
這篇文章主要介紹了C++11中std::move、std::forward、左右值引用、移動構造函數的測試,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

關于C++11新特性之std::move、std::forward、左右值引用網上資料已經很多了,我主要針對測試性能做一個測試,梳理一下這些邏輯,首先,左值比較熟悉,右值就是臨時變量,意味著使用一次就不會再被使用了。針對這兩種值引入了左值引用和右值引用,以及引用折疊的概念。

1.右值引用的舉例測試

#include <iostream>
using namespace std;
​
//創(chuàng)建一個測試類
class A
{
public:
  A() : m_a(55)
  {
  }
​
  int m_a;
};
​
void funcA(A&& param) // 右值引用參數,只接受右值
{
  cout << param.m_a << endl; // param與a的地址一致,僅僅只是取了一個新名字
}
​
int main()
{
  A a;
  funcA(move(a)); //必須將其轉換為右值
  cout << a.m_a << endl; //正常打印,所以std::move并沒有移動的能力
  return 0;
}

2.左值和右值引用的舉例測試,以及引出萬能引用

構造一組重載函數,分別接受右值,和左值的參數,還有const A&的參數重載函數。

void funcA(const A& param)//既可以接受右值引用,也可以接受左值引用,但是有一個隱式轉換const A&
void funcA(A& param)// 接受左值引用 
void funcA(A&& param) // 接受右值引用

const A& param既可以接受右值引用,也可以接受左值引用,但是存在一個隱式轉換,const使用受限制。

#include <iostream>
using namespace std;
​
//創(chuàng)建一個測試類
class A
{
public:
  A() : m_a(55) // 構造函數
  {
    cout << "Constructor" << endl;
  }
  A(const A & other) : m_a(55) // copy構造函數
  {
    cout << "Copy Constructor" << endl;
    if (this == &other)
    {
      return;
    }
    this->m_a = other.m_a;
  }
  A& operator=(const A& other) // 賦值構造函數
  {
    cout << "= Constructor" << endl;
    if (this == &other)
    {
      return *this;
    }
    this->m_a = other.m_a;
    return *this;
  }
  int m_a;
};
void test(A&& pa) //測試是否為右值
{
  cout << "只接受右值" << endl;
}
void funcA(const A& param) // 既可以接受右值引用,也可以接受左值引用,但是有一個隱式轉換const A&
{
  //test(param); //編譯不過,param可以接受右值,但是param被轉換為const左值
  //test(std::forward<A>(param)); //編譯不過,param可以接受右值,但是param被轉換為const左值
  cout << param.m_a << endl; 
}
void funcA(A& param) // 接受左值引用 
{
  //test(param); //編譯不過,param可以接受右值,但是param被轉換為左值
  test(std::forward<A>(param)); //編譯通過,通過forward轉發(fā)
  cout << param.m_a << endl;
}
void funcA(A&& param) // 接受右值引用
{
  //test(param); //編譯不過,param被轉換為左值
  test(std::forward<A>(param)); //編譯通過,通過forward轉發(fā)
  cout << param.m_a << endl;
}
​
int main()
{
  A a;
  const A& b = a;
  funcA(a);
  funcA(move(a));
  funcA(b);
  cout << a.m_a << endl; //正常打印,所以std::move并沒有移動的能力
  return 0;
}

對此C++11引入了萬能引用的概念,使得不需要那么多的重載函數,既可以接受右值引用,也可以接受左值引用。但是函數內部,再需要調用一個左值或者右值的函數時,我們就得需要forward模版類。

#include <iostream>
using namespace std;
​
//創(chuàng)建一個測試類
class A
{
public:
  A() : m_a(new int(55)) // 構造函數
  {
    cout << "Constructor" << endl;
  }
  A(const A & other) : m_a(new int(55)) // copy構造函數
  {
    cout << "Copy Constructor" << endl;
    if (this == &other)
      return;
    this->m_a = other.m_a;
  }
  A& operator=(const A& other) // 賦值構造函數
  {
    cout << "= Constructor" << endl;
    if (this == &other)
      return *this;
​
    this->m_a = other.m_a;
    return *this;
  }
  int* m_a;
};
void test(A&& pa) //測試是否為右值
{
  cout << "只接受右值" << endl;
}
void test(A& pa) //測試是否為左值
{
  cout << "只接受左值" << endl;
}
​
template<class T>
void funcA(T&& param)
{
  test(std::forward<T>(param)); //編譯通過,通過forward完美轉發(fā)
  cout << *param.m_a << endl;
}
​
int main()
{
  A a;
  funcA(a);
  funcA(move(a));
  cout << *a.m_a << endl; //正常打印,所以std::move并沒有移動的能力
  return 0;
}

3.移動構造函數的引出

以上的所有特性,所能體現(xiàn)出來的是我們對于臨時變量的使用,盡可能的使用中間生成的臨時變量,提高性能,所謂的榨取最后的性能。移動構造函數注意的兩點

1.調用移動構造函數時參數(被移動者)必須是右值。

2.調用移動構造函數后被移動者就不能再被使用。

#include <iostream>
using namespace std;
​
//創(chuàng)建一個測試類
class A
{
public:
  A() : m_a(new int(55)) // 構造函數
  {
    cout << "Constructor" << endl;
  }
  A(const A & other) : m_a(new int(55)) // copy構造函數
  {
    cout << "Copy Constructor" << endl;
    if (this == &other)
    {
      return;
    }
    this->m_a = other.m_a;
  }
  A& operator=(const A& other) // 賦值構造函數
  {
    cout << "= Constructor" << endl;
    if (this == &other)
    {
      return *this;
    }
    this->m_a = other.m_a;
    return *this;
  }
​
  A(A&& other) : m_a(other.m_a) // 移動構造函數,參數是一個右值,
  {
    cout << "Move Constructor" << endl;
    if (this == &other)
    {
      return;
    }
    other.m_a = nullptr; //移動后將被移動的對象數據清空
  }
​
  int* m_a;
};
void test(A&& pa) //測試是否為右值
{
  cout << "只接受右值" << endl;
}
void test(A& pa) //測試是否為左值
{
  cout << "只接受左值" << endl;
}
​
template<class T>
void funcA(T&& param)
{
  test(std::forward<T>(param)); //編譯通過,通過forward完美轉發(fā)
  cout << *param.m_a << endl;
}
​
int main()
{
  A a;
  funcA(a);
  funcA(move(a));
  A b(move(a)); //調用移動構造函數,新的對象是b對象
  cout << *a.m_a << endl; //數據已被移動,程序崩潰
  return 0;
}

移動構造函數一定程度上較少了臨時內存的申請,減少不必要的拷貝,節(jié)省了空間和時間。以上特性在使用中還有很多需要注意的地方,如果我遇到了會及時的添加到這里,分享給大家,一起加油。

到此這篇關于C++11中std::move、std::forward、左右值引用、移動構造函數的測試問題的文章就介紹到這了,更多相關C++11中std::move、std 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 手把手教你實現(xiàn)漂亮的Qt?登錄界面

    手把手教你實現(xiàn)漂亮的Qt?登錄界面

    最近在使用Qt5,Qt?Creator做一個管理系統(tǒng)類的項目,需要用到登錄界面,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Linux下C語言的幾道經典面試題小結(分享)

    Linux下C語言的幾道經典面試題小結(分享)

    下面小編就為大家?guī)硪黄狶inux下C語言的幾道經典面試題小結(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • C++用指針變量作為函數的參數接受數組的值的問題詳細總結

    C++用指針變量作為函數的參數接受數組的值的問題詳細總結

    以下是對C++中用指針變量作為函數的參數接受數組的值的問題進行了詳細的總結介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • 一篇文章帶你了解C語言浮點數之間的比較規(guī)則

    一篇文章帶你了解C語言浮點數之間的比較規(guī)則

    這篇文章主要介紹了魔性的float浮點數精度問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-08-08
  • C++ Qt之halcon讀取像素項目過程詳解

    C++ Qt之halcon讀取像素項目過程詳解

    這篇文章主要介紹了C++ Qt之halcon讀取像素項目過程詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-09-09
  • Qt 使用Poppler實現(xiàn)pdf閱讀器的示例代碼

    Qt 使用Poppler實現(xiàn)pdf閱讀器的示例代碼

    下面小編就為大家分享一篇Qt 使用Poppler實現(xiàn)pdf閱讀器的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • 淺析C語言中的sizeof

    淺析C語言中的sizeof

    sizeof是C/C++中的一個操作符(operator),作用就是返回一個對象或者類型所占的內存字節(jié)數。返回值類型為size_t,在頭文件stddef.h中定義
    2013-07-07
  • C語言將音視頻時鐘同步封裝成通用模塊的方法

    C語言將音視頻時鐘同步封裝成通用模塊的方法

    視頻的時鐘基于視頻幀的時間戳,由于視頻是通過一定的幀率渲染的,采用直接讀取當前時間戳的方式獲取時鐘會造成一定的誤差,精度不足,這篇文章主要介紹了c語言將音視頻時鐘同步封裝成通用模塊,需要的朋友可以參考下
    2022-09-09
  • C語言模擬實現(xiàn)動態(tài)通訊錄

    C語言模擬實現(xiàn)動態(tài)通訊錄

    本文主要介紹了C語言模擬實現(xiàn)動態(tài)通訊錄,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 深入理解Java事務的原理與應用

    深入理解Java事務的原理與應用

    下面小編就為大家?guī)硪黄钊肜斫釰ava事務的原理與應用。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06

最新評論

邵东县| 和政县| 会昌县| 察哈| 新竹市| 余江县| 东安县| 新源县| 保靖县| 闽清县| 鄂托克旗| 织金县| 正镶白旗| 铜梁县| 丹东市| 佛冈县| 堆龙德庆县| 福安市| 阳信县| 个旧市| 和政县| 蚌埠市| 章丘市| 台东市| 灌云县| 仪陇县| 邓州市| 合肥市| 宜君县| 庆安县| 普兰县| 皮山县| 微山县| 霍城县| 石河子市| 谢通门县| 三河市| 静乐县| 五家渠市| 千阳县| 周至县|