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

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

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

錯(cuò)誤示范

push_back 這么寫是錯(cuò)的:

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)用者在這里會(huì)發(fā)生一次臨時(shí)對(duì)象 TMP 的復(fù)制,稍后在函數(shù)退出點(diǎn)處 TMP 還會(huì)被隱式析構(gòu)。所以這個(gè)寫法不是良構(gòu)

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

正確工作

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

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

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();
    }
  }
};

注意右值加上移動(dòng)語(yǔ)義才是一對(duì)搭配。T t 和移動(dòng)語(yǔ)義在一起只是一種錯(cuò)覺。

你還可以加上一個(gè) push_back 的移動(dòng)語(yǔ)義:

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

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

X-class

hicc::debug::X 是一個(gè)專門用來(lái)調(diào)試 RVO,In-place construction,Copy Elision 等等特性的工具類,它平平無(wú)奇,只不過是在若干位置埋點(diǎn)冰打印 stdout 文字而已,這可以讓我們直觀觀察到哪些行為實(shí)際上發(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ù)制消除問題解決示例詳析的詳細(xì)內(nèi)容,更多關(guān)于c++ 復(fù)制消除問題的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

平江县| 航空| 南涧| 金寨县| 噶尔县| 当涂县| 疏勒县| 长子县| 长葛市| 河津市| 裕民县| 二连浩特市| 石屏县| 稻城县| 渑池县| 江口县| 余姚市| 满洲里市| 牟定县| 弥渡县| 平陆县| 修文县| 枣强县| 黑山县| 阿拉善盟| 九龙县| 鹤岗市| 闵行区| 石楼县| 环江| 甘南县| 泉州市| 盐津县| 专栏| 穆棱市| 城步| 繁昌县| 洪洞县| 科尔| 钟山县| 丽水市|