C++ 新特性 | C++ 11 | 移動語義

文章目錄

  • 一、移動語義
    • 1、為什么需要移動語義?
    • 2、怎么“偷”?——右值引用(`&&`)
    • 3、如何實現移動語義?——移動構造函數/賦值
    • 4、什么時候觸發移動?
    • 5、移動 vs 拷貝

一、移動語義

1、為什么需要移動語義?

傳統拷貝(=)會復制整個對象,但如果對象很大(如 vector<string>),拷貝開銷大。
移動語義的核心思想:“偷資源”,避免不必要的深拷貝,提升性能。

2、怎么“偷”?——右值引用(&&

  • 右值(臨時對象、字面量等) 的生命周期短,可以安全“偷”它的資源。
  • 右值引用 && 用來綁定右值,表示“這個值可以移動”。

示例:

std::string s1 = "Hello";
std::string s2 = std::move(s1);  // 把 s1 的資源“偷”給 s2
  • s1 變成空(資源被移動),s2 直接接管原內存,沒有拷貝

3、如何實現移動語義?——移動構造函數/賦值

類需要定義移動構造函數移動賦值運算符

class MyObject {
public:// 移動構造函數(參數是右值引用)MyObject(MyObject&& other) noexcept {data_ = other.data_;  // 直接“偷”指針other.data_ = nullptr;  // 原對象置空}// 移動賦值運算符MyObject& operator=(MyObject&& other) noexcept {if (this != &other) {delete data_;      // 釋放自己的資源data_ = other.data_;  // “偷”對方的資源other.data_ = nullptr;}return *this;}private:int* data_;  // 假設管理動態內存
};

關鍵點:

  • 直接“竊取”資源(如指針),避免深拷貝。
  • 把原對象的資源置空(防止重復釋放)。

4、什么時候觸發移動?

  • 顯式移動std::move(obj) 強制轉成右值引用。
  • 隱式移動:函數返回臨時對象時(編譯器優化)。

示例:

std::vector<int> createBigVector() {std::vector<int> v = {1, 2, 3, 4, 5};return v;  // 編譯器可能優化為移動(而非拷貝)
}auto v = createBigVector();  // 移動構造,無拷貝

5、移動 vs 拷貝

拷貝移動
操作深復制(完整備份)“偷”資源(直接接管)
開銷高(內存、時間)低(僅指針交換)
原對象保持不變被置空(資源轉移)

一句話總結:

移動語義通過 &&std::move “偷”臨時對象的資源,避免深拷貝,提升性能。適用于管理動態內存的類(如 vectorstring、自定義資源類)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/74200.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/74200.shtml
英文地址,請注明出處:http://en.pswp.cn/web/74200.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

wsl下ubuntu安裝寶塔

在 WSL (Windows Subsystem for Linux) 下的 Ubuntu 中安裝寶塔面板的步驟如下&#xff1a; 1. 確保 WSL 環境正常 已安裝 WSL 2 并啟用 Ubuntu 發行版&#xff08;推薦 Ubuntu 20.04/22.04&#xff09;。 在 PowerShell 中檢查 WSL 版本&#xff1a; wsl --list --verbose 如…

UDP網絡通信

UDP網絡通信&#xff1a; 步驟1 創建套接字&#xff1a; #include <sys/types.h> #include <sys/socket.h>int socket(int domain, int type, int protocol);參數一 domain&#xff1a; AF_UNIX Local communication unix(7) 本地通信 AF_INET IPv4 Inte…

教你快速理解linux中的NUMA節點探測是干什么用的?

想象一個大城市被劃分成幾個區&#xff08;比如東區、西區&#xff09;。每個區有自己的超市&#xff08;內存&#xff09;&#xff0c;居民&#xff08;CPU&#xff09;去本區的超市買東西最快&#xff0c;去其他區的超市會慢一些。 NUMA節點探測&#xff0c;就是Linux系統在…

使用 Less 實現 PC 和移動端樣式適配

&#x1f310; 使用 Less 實現 PC 和移動端樣式適配 —— 以 position 屬性為例 在前端開發中&#xff0c;我們常常會遇到這樣一個場景&#xff1a; 在 PC 頁面中需要某個元素是 position: relative;&#xff0c;但在移動端卻希望它是 position: inherit;&#xff0c;以便更靈…

企業戰略管理(設計與工程師類)-2-戰略規劃及管理過程-1-概述

戰略管理過程 參考資料&#xff1a; 戰略管理 - 清華大學- 蔡臨寧公司戰略與風險管理 - 華中科技大學 - 賀遠瓊戰略管理 - 北京理工大學 - 楊萬榮DeepSeek - 深度思考與聯網檢索 AFI框架 戰略管理最典型的就是采用傳統的AFI通用戰略管理框架&#xff08;模型&#xff09;&a…

Swoole 的 Hyperf 框架和 Go 的 Gin 框架高并發原理以及技術實現對比分析

Swoole 的 Hyperf 框架和 Go 的 Gin 框架雖然都支持高并發&#xff0c;但它們的實現原理、底層機制和適用場景有顯著差異。以下從 高并發原理、技術實現區別、優缺點 三個方面詳細分析&#xff1a; 一、高并發實現原理 1. Hyperf (PHP Swoole) Hyperf 的高并發能力基于 Swoo…

【教程】如何利用bbbrisk一步一步實現評分卡

利用bbbrisk一步一步實現評分卡 一、什么是評分卡1.1.什么是評分卡1.2.評分卡有哪些 二、評分卡怎么弄出來的2.1.如何制作評分卡2.2.制作評分卡的流程 三、變量的分箱3.1.數據介紹3.2.變量自動分箱3.3.變量的篩選 四、構建評分卡4.1.評分卡實現代碼4.2.評分卡表4.3.閾值表與分數…

AI日報 - 2025年4月2日

&#x1f31f; 今日概覽&#xff08;60秒速覽&#xff09; ▎&#x1f916; AGI突破 | 研究揭示零RL訓練可誘發模型頓悟&#xff0c;Anthropic發布Claude 3.5內部機制研究&#xff0c;簡化語言模型推理優化新方法提出。 DeepSeek-R1無需額外指令即可深度推理&#xff1b;Anthro…

探索 Kubernetes 網絡穿透:如何從外部訪問 K8s Pod 地址

文章目錄 探索 Kubernetes 網絡穿透&#xff1a;如何從外部訪問 K8s Pod 地址為什么需要外部訪問 Pod 地址&#xff1f;常見的網絡穿透方案NodePortLoadBalancerIngressPort-ForwardHostNetworkkt-connect&#xff1a;為開發調試提供便捷穿透 實踐建議與注意事項各方案對比表總…

深入理解 Apache Dagster:數據管道編排實戰指南

本文系統介紹了 Apache Dagster 的核心概念與實踐方法&#xff0c;涵蓋環境搭建、管道定義、運行調試及高級功能&#xff0c;幫助開發者快速掌握這一現代化數據編排工具&#xff0c;提升數據工程效率。 1. 背景與核心優勢 隨著數據驅動應用的復雜化&#xff0c;傳統工具在可維…

Minio集群部署

Minio集群部署 資源規劃 IP服務規劃配置192.168.116.138minio-116核32G磁盤10T192.168.116.139minio-216核32G磁盤10T192.168.116.140minio-316核32G磁盤10T192.168.116.141minio-416核32G磁盤10T192.168.116.128nginx代理8核16G磁盤500G 基本環境配置 下面命令minio4臺設備…

操作系統高頻(六)linux內核

操作系統高頻&#xff08;六&#xff09;linux內核 1.內核態&#xff0c;用戶態的區別??? 內核態和用戶態的區別主要在于權限和安全性。 權限&#xff1a;內核態擁有最高的權限&#xff0c;可以訪問和執行所有的系統指令和資源&#xff0c;而用戶態的權限相對較低&#x…

強大而易用的JSON在線處理工具

強大而易用的JSON在線處理工具&#xff1a;程序員的得力助手 在當今的軟件開發世界中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;已經成為了數據交換的通用語言。無論是前端還是后端開發&#xff0c;我們都經常需要處理、驗證和轉換JSON數據。今天&a…

【學習記錄】pytorch載入模型的部分參數

需要從PointNet網絡框架中提取encoder部分的參數&#xff0c;然后賦予自己的模型。因此&#xff0c;需要從一個已有的.pth文件讀取部分參數&#xff0c;加載到自定義模型上面。做了一些嘗試&#xff0c;記錄如下。 關于模型保存與載入 torch.save(): 使用Python的pickle實用程…

【藍橋杯14天沖刺課題單】Day 8

1.題目鏈接&#xff1a;19714 數字詩意 這道題是一道數學題。 先考慮奇數&#xff0c;已知奇數都可以表示為兩個相鄰的數字之和&#xff0c;2k1k(k1) &#xff0c;那么所有的奇數都不會被計入。 那么就需要考慮偶數什么情況需要被統計。根據打表&#xff0c;其實可以發現除了…

鴻蒙ArkTS開發:微信/系統來電通話監聽功能實現

本文將介紹如何在鴻蒙應用中使用ArkTS實現通話監聽和錄音功能&#xff0c;利用harmony-utils工具庫簡化開發流程。 工具庫地址 一、功能概述 本實現包含以下核心功能&#xff1a; 通話狀態監聽&#xff1a;檢測來電、去電和通話中狀態 音頻流監控&#xff1a;通過麥克風使用…

NFS 重傳次數速率監控

這張圖展示的是 NFS 重傳次數速率監控&#xff0c;具體解釋如下&#xff1a; 1. 指標含義 監控指標 node_nfs_rpc_retransmissions_total 統計 NFS&#xff08;網絡文件系統&#xff09;通信中 RPC&#xff08;遠程過程調用&#xff09;的重傳次數&#xff0c;rate(node_nfs_…

【 <二> 丹方改良:Spring 時代的 JavaWeb】之 Spring Boot 中的國際化:支持多語言的 RESTful API

<前文回顧> 點擊此處查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、開篇整…

黑帽SEO之搜索引擎劫持-域名劫持原理分析

問題起源 這是在《Web安全深度剖析》的第二章“深入HTTP請求流程”的2.3章節“黑帽SEO之搜索引擎劫持”提到的內容&#xff0c;但是書中描述并不詳細&#xff0c;沒有講如何攻擊達到域名劫持的效果。 書中對SEO搜索引擎劫持的現象描述如下&#xff1a;直接輸入網站的域名可以進…

theos工具來編譯xcode的swiftUI項目為ipa文件

Theos 是一個開源的開發工具套件&#xff0c;主要用于為 iOS/macOS 平臺開發和編譯 越獄插件&#xff08;Tweaks&#xff09;、動態庫、命令行工具等。它由 Dustin Howett 創建&#xff0c;并被廣泛用于越獄社區的開發中。但這里我主要使用它的打包ipa功能&#xff0c;因為我的…