從零開始學Rust:所有權(Ownership)機制精要

文章目錄

  • 第四章:Ownership 所有權
    • 核心概念
    • 關鍵機制
    • 引用與借用(Reference & Borrowing)
      • 懸垂引用問題
        • 錯誤示例分析
        • 解決方案
        • 引用安全規則
    • 切片(Slice)
    • 內存安全保證

第四章:Ownership 所有權

Ownership is Rust’s most unique feature, and it enables Rust to make memory safety guarantees without needing a garbage collector.

核心概念

所有權三原則:

  • 每個值有且只有一個所有者
  • 所有權可轉移(move)
  • 所有者離開作用域時值自動釋放(drop)
  • Each value in Rust has a variable that’s called its owner.
  • There can only be one owner at a time.
  • When the owner goes out of scope, the value will be dropped.

內存管理:

  • 棧(Stack):固定大小數據,高效自動管理
  • 堆(Heap):動態大小數據,需顯式分配

Example:

fn main() {let mut s = String::from("hello");s.push_str(", world!"); // push_str() appends a literal to a Stringprintln!("{}", s); // This will print `hello, world!`
}

Note: In C++, this pattern of deallocating resources at the end of an item’s lifetime is sometimes called Resource Acquisition Is Initialization (RAII). The drop function in Rust will be familiar to you if you’ve used RAII patterns.

關鍵機制

  • 移動語義(Move):

    • 賦值操作默認轉移所有權(非淺拷貝)
    • 原變量隨即失效,防止懸垂指針
    let s1 = String::from("hello");
    let s2 = s1;  // s1所有權轉移至s2,s1失效
    

    If you’ve heard the terms shallow copy and deep copy while working with other languages, the concept of copying the pointer, length, and capacity without copying the data probably sounds like making a shallow copy. But because Rust also invalidates the first variable, instead of being called a shallow copy, it’s known as a move. In this example, we would say that s1 was moved into s2.
    在這里插入圖片描述
    Rust will never automatically create “deep” copies of your data. Therefore, any automatic copying can be assumed to be inexpensive in terms of runtime performance.

  • 克隆(Clone):

    • 顯式深度拷貝堆數據
    let s1 = String::from("hello");
    let s2 = s1.clone();  // 完整拷貝數據
    

    When you see a call to clone, you know that some arbitrary code is being executed and that code may be expensive. It’s a visual indicator that something different is going on.
    在這里插入圖片描述

  • Copy trait:

    • 標量類型(整數、布爾值等)自動實現
    • 賦值時執行位拷貝而非所有權轉移
    • 與Drop trait互斥

引用與借用(Reference & Borrowing)

  • 不可變引用:

    • 允許多個同時存在
    • 禁止修改數據
    fn calculate_length(s: &String) -> usize {s.len()
    }
    
  • 可變引用:

    • 獨占性:同一作用域只能存在一個
    • 數據競爭預防
    fn change(s: &mut String) {s.push_str(", world");
    }
    

懸垂引用問題

懸垂引用(Dangling Reference)是指指針指向的內存已經被釋放但指針仍然存在的情況,這是內存安全的重大威脅。

錯誤示例分析
fn dangle() -> &String {  // 嘗試返回字符串引用let s = String::from("hello");  // 創建局部變量&s  // 返回局部變量的引用
}  // s離開作用域被釋放,返回的引用變成懸垂指針

編譯器會阻止這段代碼編譯,錯誤提示:

error[E0106]: missing lifetime specifier
解決方案
  1. 轉移所有權
fn no_dangle() -> String {  // 直接返回String(轉移所有權)let s = String::from("hello");s  // 所有權轉移給調用者
}
  1. 使用靜態生命周期
fn get_static_str() -> &'static str {"hello"  // 字符串字面量有'static生命周期
}
引用安全規則
  1. 可變性獨占原則:
  • 任意時刻,一個數據要么:
    • 有唯一的可變引用(&mut T)
    • 或有多個不可變引用(&T)
  • 二者不可同時存在
  1. 生命周期保證:
  • 所有引用必須始終有效

  • 編譯器通過生命周期檢查確保:

    fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {if x.len() > y.len() { x } else { y }
    }
    

切片(Slice)

  • 字符串切片:
    • 安全視圖,不獲取所有權
    let s = String::from("hello world");let hello = &s[0..5];
    let world = &s[6..11];
    
  • 通用原則:
    • 編譯時保證引用有效性
    • 自動邊界檢查防止越界訪問

在這里插入圖片描述

內存安全保證

所有權系統在編譯期實現:

  • 自動內存回收(RAII模式)
  • 無數據競爭
  • 無懸垂指針
  • 零運行時開銷

這套機制使Rust無需垃圾回收器即可保證內存安全,同時保持與C/C++相當的性能。

The concepts of ownership, borrowing, and slices ensure memory safety in Rust programs at compile time. The Rust language gives you control over your memory usage in the same way as other systems programming languages, but having the owner of data automatically clean up that data when the owner goes out of scope means you don’t have to write and debug extra code to get this control.

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

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

相關文章

一旦懂得,有趣得緊1:詞根tempt-(嘗試)的兩種解法

詞根tempt-嘗試 tempt vt.引誘&#xff1b;誘惑&#xff1b;慫恿&#xff1b;利誘&#xff1b;勸誘&#xff1b;鼓動 temptation n.引誘&#xff1b;誘惑 // tempt v.引誘 -ation 名詞后綴 attempt v.&n.嘗試&#xff0c;試圖 // at- 加強 tempt 嘗試contempt n.蔑視&am…

召喚數學精靈

1.召喚數學精靈 - 藍橋云課 問題描述 數學家們發現了兩種用于召喚強大的數學精靈的儀式&#xff0c;這兩種儀式分別被稱為累加法儀式 A(n) 和累乘法儀式 B(n)。 累加法儀式 A(n) 是將從1到 n 的所有數字進行累加求和&#xff0c;即&#xff1a; A(n)12?n 累乘法儀式 B(n) …

C語言實現查表8位SAE J1850 CRC

背景&#xff1a; 在做霍爾采集電流的時候&#xff0c;CSSV1500N 系列電流傳感器通過can數據輸出的報文需要做crc校驗&#xff0c;嵌入式常用查表的方式&#xff0c;所以就問了下deepseek怎么算這個CRC. 以下是使用 查表法&#xff08;Lookup Table&#xff09; 在C語言中高效…

【UE5.3.2】初學1:適合初學者的入門路線圖和建議

3D人物的動作制作 大神分析:3D人物的動作制作通常可以分為以下幾個步驟: 角色綁定(Rigging):將3D人物模型綁定到一個骨骼結構上,使得模型能夠進行動畫控制。 動畫制作(Animation):通過控制骨骼結構,制作出人物的各種動作,例如走路、跳躍、打斗等。 動畫編輯(Ani…

mapreduce的工作原理

MapReduce 是 Hadoop 中實現分布式并行計算的核心框架&#xff0c;其工作原理基于“分而治之”的思想&#xff0c;將大規模數據處理任務分解為 Map&#xff08;映射&#xff09; 和 Reduce&#xff08;歸約&#xff09; 兩個階段。 一、MapReduce 核心流程 1. Input 階段 - 輸…

換季推廣不好做?DeepBI用一鍵托管的方式,讓廣告投放跑得快、準、穩

每年換季&#xff0c;尤其是春夏、秋冬交替的節點&#xff0c;都是電商平臺上各類季節性商品扎堆上新的高峰期。無論是服飾鞋包、家居戶外&#xff0c;還是母嬰用品、美妝護膚&#xff0c;許多商品都有著強烈的“時間窗口效應”——一旦錯過了熱賣期&#xff0c;流量下滑迅速&a…

Qt5.14.2+Cmake使用mingw64位編譯opencv4.5成功圖文教程

? 一、下載安裝相關編譯環境軟件 1.1 Python3.8&#xff1a;安裝路徑:C:\Users\Administrator\AppData\Local\Programs\Python\Python38-32 安裝包&#xff1a;python3.8.exe 1.2 QT5.14.2&#xff1a;安裝路徑:C:\Qt\Qt5.14.2 1.3 opencv4.5&#xff1a;解壓路徑D:\o…

OpenBMC:BmcWeb 處理http請求3 字典樹查找節點

OpenBMC:BmcWeb 處理http請求2 查找路由對象-CSDN博客 findRouteByPerMethod實際上是調用了perMethod.trie.find(url);來查找路由對象的 class Trie {struct FindResult{unsigned ruleIndex;std::vector<std::string> params;};FindResult findHelper(const std::string…

Openssl自簽證書相關知識

1.前提 檢查是否已安裝 openssl $ which openssl /usr/bin/openssl 2.建立CA授權中心 2.1.生成ca私鑰(ca-prikey.pem) 初始化 OpenSSL 證書頒發機構(CA)的序列號文件 在生成證書時,ca.srl 的初始序列號需正確初始化(如 01),否則可能導致證書沖突 這會將 01 顯示在屏幕…

K個一組翻轉鏈表--囊括半數鏈表題的思想

K 個一組翻轉鏈表 這道算法題就是鏈表多個算法思想的結合&#xff0c;解決這一道leetcodehot100的鏈表題至少能做一半了 大概有一下幾個點 1.鏈表定位 2.鏈表翻轉 3.哨兵節點 4.鏈表合并 看看題目 給你鏈表的頭節點 head &#xff0c;每 k 個節點一組進行翻轉&#xff…

Flutter敏感詞過濾實戰:基于AC自動機的高效解決方案

Flutter敏感詞過濾實戰&#xff1a;基于AC自動機的高效解決方案 在社交、直播、論壇等UGC場景中&#xff0c;敏感詞過濾是保障平臺安全的關鍵防線。本文將深入解析基于AC自動機的Flutter敏感詞過濾實現方案&#xff0c;通過原理剖析實戰代碼性能對比&#xff0c;帶你打造毫秒級…

UML中的用例圖和類圖

在UML&#xff08;統一建模語言&#xff09;中&#xff0c;**用例圖&#xff08;Use Case Diagram&#xff09;和類圖&#xff08;Class Diagram&#xff09;**是兩種最常用的圖表類型&#xff0c;分別用于描述系統的高層功能和靜態結構。以下是它們的核心概念、用途及區別&…

深入解析:HarmonyOS Design設計語言的核心理念

深入解析&#xff1a;HarmonyOS Design設計語言的核心理念 在當今數字化迅速發展的時代&#xff0c;用戶對操作系統的體驗要求越來越高。華為的HarmonyOS&#xff08;鴻蒙操作系統&#xff09;應運而生&#xff0c;旨在為用戶提供全場景、全設備的智慧體驗。其背后的設計語言—…

Vue 類與樣式

數據綁定的一個常見需求場景是操縱元素的 CSS class 列表和內聯樣式。因為 class 和 style 都是 attribute&#xff0c;我們可以和其他 attribute 一樣使用 v-bind 將它們和動態的字符串綁定。但是&#xff0c;在處理比較復雜的綁定時&#xff0c;通過拼接生成字符串是麻煩且易…

Android 中獲取顏色資源

在 Android 開發中&#xff0c;資源&#xff08;如字符串、顏色等&#xff09;通常存儲在 res 文件夾中&#xff0c;并通過資源 ID 進行訪問。資源 ID 是一個整型值&#xff0c;用于唯一標識資源&#xff0c;若需要將資源轉換為整型值&#xff0c;通常是指獲取資源 ID 或從資源…

Linux中的文件尋址

Linux的層級結構 在Linux中一切皆文件 其中 要注意在命令行中看實際選擇寫哪一種路徑 相對路徑 絕對路徑名稱的簡寫&#xff0c;省略了用戶當前所在的系統位置此名稱只有在管理當前所在系統目錄中子文件時才能使用系統中不以/開有的文件名稱都為相對路徑在程序操作時會自動…

洛谷: P1825 [USACO11OPEN] Corn Maze S

原題鏈接:P1825 [USACO11OPEN] Corn Maze S - 洛谷 題目描述 This past fall, Farmer John took the cows to visit a corn maze. But this wasnt just any corn maze: it featured several gravity-powered teleporter slides, which cause cows to teleport instantly from…

探秘DeepSeek:開源AI領域的創新先鋒

一、引言 在人工智能迅猛發展的當下&#xff0c;眾多先進的模型如雨后春筍般涌現&#xff0c;而 DeepSeek 無疑是其中備受矚目的一顆新星。它以獨特的技術優勢和廣泛的應用場景&#xff0c;在 AI 領域嶄露頭角。 二、DeepSeek 的誕生與背景 DeepSeek 由來自廣東省的中國企業…

Spring Boot啟動流程

1. 啟動類與main方法 入口點&#xff1a;Spring Boot應用通常有一個帶有SpringBootApplication注解的主類&#xff0c;并包含一個public static void main(String[] args)方法。 SpringBootApplication是一個組合注解&#xff0c;包含了&#xff1a; Configuration: 標記該類為…

設計模式——設計模式理念

文章目錄 參考&#xff1a;[設計模式——設計模式理念](https://mp.weixin.qq.com/s/IEduZFF6SaeAthWFFV6zKQ)參考&#xff1a;[設計模式——工廠方法模式](https://mp.weixin.qq.com/s/7tKIPtjvDxDJm4uFnqGsgQ)參考&#xff1a;[設計模式——抽象工廠模式](https://mp.weixin.…