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

c++??復(fù)制消除問題解決示例詳析

 更新時間:2023年08月10日 10:51:01   作者:hedzr  
這篇文章主要為大家介紹了c++??復(fù)制消除問題解決示例詳析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

錯誤示范

push_back 這么寫是錯的:

template<class T>
  class threaded_message_queue {
    public:
    using lock = std::unique_lock<std::mutex>;
    void push_back(T t) {
      {
        lock l(_m);
        _data.push_back(std::move(t));
      }
      _cv.notify_one();
    }
  }
};//

入?yún)?nbsp;T t 導(dǎo)致了調(diào)用者在這里會發(fā)生一次臨時對象 TMP 的復(fù)制,稍后在函數(shù)退出點處 TMP 還會被隱式析構(gòu)。所以這個寫法不是良構(gòu)。

至于函數(shù)體中的 std::move(t) 也就是聊勝于無了,它并不會讓 t 少掉 TMP 的復(fù)制,僅僅只是少掉了 t 到 _data 的一次復(fù)制而已。

正確工作

做模板類開發(fā)時,經(jīng)常會遇到 push_back 的這種場景。

正確的 push_back 應(yīng)該包含左值復(fù)制和右值移動兩種語義,一般來說像是這樣子:

template<class T>
  class threaded_message_queue {
    public:
    using lock = std::unique_lock<std::mutex>;
    void emplace_back(T &&t) {
      {
        lock l(_m);
        _data.template emplace_back(std::move(t));
      }
      _cv.notify_one();
    }
    void push_back(T const &t) {
      {
        lock l(_m);
        _data.push_back(t);
      }
      _cv.notify_one();
    }
  }
};

注意右值加上移動語義才是一對搭配。T t 和移動語義在一起只是一種錯覺。

你還可以加上一個 push_back 的移動語義:

void push_back(T &&t) {
      {
        lock l(_m);
        _data.template emplace_back(std::move(t));
      }
      _cv.notify_one();
    }

這是因為按照約定,emplace_back 通常采用模板變參并實現(xiàn) T 類的原位構(gòu)造。這個話題我在 C++ 中的原位構(gòu)造函數(shù)及完美轉(zhuǎn)發(fā) - 寫我們自己的 variant 包裝類 已經(jīng)有過一定的討論,這里就不詳述了。

X-class

hicc::debug::X 是一個專門用來調(diào)試 RVO,In-place construction,Copy Elision 等等特性的工具類,它平平無奇,只不過是在若干位置埋點冰打印 stdout 文字而已,這可以讓我們直觀觀察到哪些行為實際上發(fā)生了。

X-class 在構(gòu)造函數(shù)的入?yún)⒉糠钟邢嗨频臉?gòu)造:

namespace hicc::debug {
    class X {
        std::string _str;
        void _ct(const char *leading) {
            printf("  - %s: X[ptr=%p].str: %p, '%s'\n", leading, (void *) this, (void *) _str.c_str(), _str.c_str());
        }
    public:
        X() {
            _ct("ctor()");
        }
        ~X() {
            _ct("dtor");
        }
        X(std::string &&s)
            : _str(std::move(s)) {
            _ct("ctor(s)");
        }
        X(std::string const &s)
            : _str(s) {
            _ct("ctor(s(const&))");
        }
        X &operator=(std::string &&s) {
            _str = std::move(s);
            _ct("operator=(&&s)");
            return (*this);
        }
        X &operator=(std::string const &s) {
            _str = s;
            _ct("operator=(const&s)");
            return (*this);
        }
        const char *c_str() const { return _str.c_str(); }
        operator const char *() const { return _str.c_str(); }
    };
} // namespace hicc::debug

以上就是c++ 復(fù)制消除問題解決示例詳析的詳細內(nèi)容,更多關(guān)于c++ 復(fù)制消除問題的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語言數(shù)據(jù)結(jié)構(gòu)通關(guān)時間復(fù)雜度和空間復(fù)雜度

    C語言數(shù)據(jù)結(jié)構(gòu)通關(guān)時間復(fù)雜度和空間復(fù)雜度

    對于一個算法,其時間復(fù)雜度和空間復(fù)雜度往往是相互影響的,當(dāng)追求一個較好的時間復(fù)雜度時,可能會使空間復(fù)雜度的性能變差,即可能導(dǎo)致占用較多的存儲空間,這篇文章主要給大家介紹了關(guān)于C語言時間復(fù)雜度、空間復(fù)雜度的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • C/C++中四種常用查找算法的實現(xiàn)

    C/C++中四種常用查找算法的實現(xiàn)

    C語言作為一種強大的編程語言,提供了多種搜索算法的實現(xiàn)方式,本文將介紹C語言中的四種常見搜索算法并提供每種算法的簡單實現(xiàn)示例,需要的小伙伴可以參考下
    2023-11-11
  • 詳解C語言之操作符

    詳解C語言之操作符

    這篇文章主要以圖文結(jié)合的方式為大家詳細介紹了C語言的操作符知識,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助
    2021-11-11
  • C語言深入淺出解析二叉樹

    C語言深入淺出解析二叉樹

    二叉樹可以簡單理解為對于一個節(jié)點來說,最多擁有一個上級節(jié)點,同時最多具備左右兩個下級節(jié)點的數(shù)據(jù)結(jié)構(gòu)。本文將詳細介紹一下C++中二叉樹的實現(xiàn)和遍歷,需要的可以參考一下
    2022-03-03
  • 理解數(shù)據(jù)結(jié)構(gòu)

    理解數(shù)據(jù)結(jié)構(gòu)

    本文是對數(shù)據(jù)結(jié)構(gòu)對編程的重要性,數(shù)據(jù)結(jié)構(gòu)對數(shù)據(jù)存儲,數(shù)據(jù)處理,內(nèi)存工作,從宏觀上理解數(shù)據(jù)結(jié)構(gòu)
    2016-07-07
  • Qt qml實現(xiàn)動態(tài)輪播圖效果

    Qt qml實現(xiàn)動態(tài)輪播圖效果

    這篇文章主要為大家詳細介紹了Qt和qml實現(xiàn)動態(tài)輪播圖效果的相關(guān)知識,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考一下
    2024-12-12
  • C++深入探究類與對象之友元與運算符重載

    C++深入探究類與對象之友元與運算符重載

    友元就是讓一個函數(shù)或者類,訪問另一個類中的私有成員;打個比方,這相當(dāng)于是說:朋友是值得信任的,所以可以對他們公開一些自己的隱私,運算符重載的實質(zhì)就是函數(shù)重載或函數(shù)多態(tài),運算符重載是一種形式的C++多態(tài),目的在于讓人能夠用同名的函數(shù)來完成不同的基本操作
    2022-04-04
  • OpenCV中C++函數(shù)imread讀取圖片的問題及解決方法

    OpenCV中C++函數(shù)imread讀取圖片的問題及解決方法

    利用C++函數(shù)imread讀取圖片的時候返回的結(jié)果總是空,而利用C函數(shù)cvLoadImage時卻能讀取到圖像。怎么回事?今天小編通過本教程給大家簡單說明原因
    2017-03-03
  • VS2019配置BOOST的方法(v1.70.0庫)

    VS2019配置BOOST的方法(v1.70.0庫)

    這篇文章主要介紹了VS2019配置BOOST的方法(v1.70.0庫),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • C語言清除scanf()緩存的案例講解

    C語言清除scanf()緩存的案例講解

    今天小編就為大家分享一篇關(guān)于C語言清除scanf()緩存的案例講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03

最新評論