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

C++11 新特性:移動語義詳解與實戰應用

     編輯:關於C++

背景:拷貝的代價

按值傳遞觸發拷貝構造函數,對於管理動態內存的類(如 vector, string, 自定義資源類),深拷貝涉及內存分配、數據複製,開銷大。C++11 引入移動語義,利用右值引用(T&&)將資源「移動」而非複製。

右值引用與移動構造/賦值

  • 右值引用綁定到臨時對象(將亡值)。
  • 移動構造函數:A(A&& other) noexcept,淺拷貝指針,置空來源指針。
  • 移動賦值運算符:A& operator=(A&& other) noexcept,釋放自身資源,接管來源資源,置空來源。

標準庫支持

vector::push_back 提供兩個重載:push_back(const T&)(拷貝)和 push_back(T&&)(移動)。傳遞臨時對象或 std::move(obj) 觸發移動版本,避免拷貝。

代碼示範

class A {
    int* data; size_t len;
public:
    A(size_t n) : len(n), data(new int[n]) {}
    // 移動構造
    A(A&& o) noexcept : data(o.data), len(o.len) { o.data = nullptr; o.len = 0; }
    // 移動賦值
    A& operator=(A&& o) noexcept {
        if (this != &o) { delete[] data; data = o.data; len = o.len; o.data = nullptr; o.len = 0; }
        return *this;
    }
    ~A() { delete[] data; }
    // 交換利用移動
    void swap(A& other) { A tmp = std::move(other); other = std::move(*this); *this = std::move(tmp); }
};

關鍵點

  • std::move 將左值轉為右值引用,啟用移動語義。
  • 移動後源對象處於「有效但未指定狀態」,不可再使用其資源。
  • 若需保留原對象值,請用拷貝而非移動。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved