首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++11 右值引用與移動語義深度解析

     編輯:C++ 入門

C++11 右值引用 && 移動構造/賦值:原理與性能實測

核心問題:臨時對象的拷貝開銷

C++98 中臨時對象(右值)只能綁定到 const 左值引用,導致不必要的深拷貝。C++11 引入右值引用 T&&,允許「盜取」臨時對象資源。

移動構造與移動賦值

class MemoryBlock {
    size_t _len; int* _data;
public:
    // 移動構造
    MemoryBlock(MemoryBlock&& other) noexcept
        : _len(other._len), _data(other._data) {
        other._len = 0; other._data = nullptr;
    }
    // 移動賦值
    MemoryBlock& operator=(MemoryBlock&& other) noexcept {
        if (this != &other) {
            delete[] _data;
            _len = other._len; _data = other._data;
            other._len = 0; other._data = nullptr;
        }
        return *this;
    }
};

std::move 與完美轉發

  • std::move(x) 將左值轉為右值引用,聲明「可被移動」。
  • 結合 std::forward 實現完美轉發,保持值類別。

實測性能提升

文中給出兩個基準測試:

  1. 字符串拼接 s1+s2+s3+s4 循環 3000 萬次:使用 return std::move(tmp) vs 直接 return tmp,前者快 30-40%。
  2. MemoryBlock 移動 vs 拷貝 10 萬次:移動快 ~30%。

關鍵點

  1. 移動操作應標記 noexcept,否則標準庫容器擴容時不敢用移動(退回拷貝)。
  2. 移動後源對象須置為有效空狀態(如指針置 nullptr)。
  3. C++17 強制複製消除 (RVO/NRVO) 進一步減少移動,但移動語義仍是資源管理基石。
  4. 智能指針 unique_ptr、shared_ptr 內部大量使用移動語義。

吐槽與思考

作者感嘆 C++ 不斷做加法(語法複雜度上升),學習成本高,建議標準委員會考慮做減法。但移動語義確實解決了長期存在的性能痛點。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved