国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【rust】| 06——語言特性 | 所有權(quán)

這篇具有很好參考價值的文章主要介紹了【rust】| 06——語言特性 | 所有權(quán)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

系列文章目錄
【rust】| 00——開發(fā)環(huán)境搭建
【rust】| 01——編譯并運行第一個rust程序
【rust】| 02——語法基礎(chǔ) | 變量(不可變?)和常量
【rust】| 03——語法基礎(chǔ) | 數(shù)據(jù)類型
【rust】| 04——語法基礎(chǔ) | 函數(shù)
【rust】| 05——語法基礎(chǔ) | 流程控制
【rust】| 06——語言特性 | 所有權(quán)

1. 所有權(quán)的概念

?所有權(quán)是Rust語言中一個關(guān)鍵的特性。它是一種內(nèi)存管理規(guī)則(機(jī)制)。它通過這個規(guī)則(即所有權(quán)系統(tǒng))結(jié)合編譯器對代碼進(jìn)行檢查 從而確保內(nèi)存安全。
?在其他語言如C/C++ 等 都有自己的內(nèi)存管理方式。C/C++需要我們顯式(手動)處理所用的內(nèi)存(申請、釋放) 如果處理不當(dāng)會造成很嚴(yán)重的內(nèi)存安全問題。而Rust中這一特性很好的可以幫我們確保內(nèi)存安全性。

2. 所有權(quán)的規(guī)則

1、每個值都對應(yīng)一個變量 owner
2、一個值只能有一個 owner
3、有作用域,當(dāng)owner超出作用域 值會被銷毀 (這個變量有生命周期 在作用域內(nèi))

3. 變量的作用域

Rust中變量的作用域和其他語言類型。比如函數(shù)體內(nèi)的 變量(局部變量) 它的作用域在 函數(shù)大括號之間 生命周期也是這么短。
【rust】| 06——語言特性 | 所有權(quán)
可以看到 超過范圍銷毀了。 對應(yīng)所有權(quán)規(guī)則的最后一條。owner 就是這個值藏在暗處的變量名。 它超過變量作用域會消失。Rust內(nèi)部在超出后 會掉清理函數(shù) drop
清理變量占用的內(nèi)存。

4. 所有權(quán)的移動/克隆

4.1 移動

Rust中的移動 類似淺拷貝 但有細(xì)節(jié)之處。
我們通過代碼例子去理解

1、變量賦值操作

【rust】| 06——語言特性 | 所有權(quán)
分析:
? 1、整型變量賦值 變量a 復(fù)制到了 變量b
? 2、字符串賦值 變量s1 復(fù)制到了 變量s2
? 我們可以看到 兩種不同的類型 操作幾乎是一樣的。 整型它只是一個數(shù)字 再怎么復(fù)制占用的大小就那么多 無關(guān)緊要??墒钱?dāng)是一個很大的字符串 復(fù)制給另一個變量 那所占用的大小(很大*2) 這樣的操作 太占用大小 咋的一個字符串準(zhǔn)備要我命啊。是不是和其他語言復(fù)制操作很類似。
? 但是在 Rust中 復(fù)制的操作 還是有細(xì)微差別的 我們深入了解下rust下 具體復(fù)制的具體過程

細(xì)看 字符串變量的定義及復(fù)制到其他變量的過程

【rust】| 06——語言特性 | 所有權(quán)
可以看到 字符串變量的內(nèi)容 hello 存儲在堆上 而 定義的變量 S1 只保存了 指向堆上內(nèi)容的指針、長度和容量這三個 這些內(nèi)容存儲在棧上。并沒有將 字符串內(nèi)容也保存。
下面我們看 S1內(nèi)容復(fù)制給S2 是怎樣的
【rust】| 06——語言特性 | 所有權(quán)
可以看到 S1 復(fù)制到 S2 也只是復(fù)制了 指針、長度、容量三件套。不重復(fù)復(fù)制堆上內(nèi)容。這樣的情況下S1 S2是不是 占用棧大小很少。

如果S1 S2把數(shù)據(jù)一起保存呢
【rust】| 06——語言特性 | 所有權(quán)
可以看到 全保存過來 每個變量 都這樣完全復(fù)制 那棧吃不消。當(dāng)內(nèi)容很大時 是不是 一個賦值操作直接給 棧空間 用完 干廢掉啦。

通過上面圖我們可以看到 rust中 變量保存了指向內(nèi)容的指針等。 S1 和S2 中的指針都指向了 數(shù)據(jù)內(nèi)容。我們知道所有權(quán)規(guī)則之一 變量超出作用域 會沒了。那么當(dāng)S1和S2 超出作用域 會嘗試釋放 因為它兩指向一個地址那么 兩次釋放是不是會出大問題呢。也稱為 雙重釋放錯誤。
當(dāng)然 rust中也會想到這種錯誤 所以它會避免啦。
【rust】| 06——語言特性 | 所有權(quán)

【rust】| 06——語言特性 | 所有權(quán)
在Rust中 執(zhí)行完 S2=S1這樣的操作 S1已經(jīng)變得無效啦 所以不會再存在上面雙重釋放的隱患了。
其實 Rust中S2 = S1 的操作類似淺拷貝 只拷貝了指針長度容量。但是rust 中超出范圍 讓其消失的規(guī)則 即S1 無效啦的操作 我們把這樣稱為 移動。

4.2 克隆 clone

Rust中 我們把類似 深拷貝(把數(shù)據(jù)內(nèi)容一起復(fù)制)的操作
稱為克隆 clone。
【rust】| 06——語言特性 | 所有權(quán)

4.3 copy

前面學(xué)習(xí)完 移動和克隆 我們理解到 在Rust中 通過變量給變量賦值的操作 如果直接賦值 S2 = S1 這種 類似于淺拷貝 而且S1會消失 沒有拷貝在堆上的內(nèi)容 而 通過克隆 s2=s1.clone() 這種 類似深拷貝的操作 這樣S1還活著。 下面我們通過例子理解COPY
【rust】| 06——語言特性 | 所有權(quán)
為什么x 還能用? 因為X是整型 編譯器編譯時 知道它的大小 將內(nèi)容全部存儲在棧中。也可以說整型具有copy特性 所以才會存在棧上。字符串型 大小我們不確定因為不知道后面會不會 改變。 在這種情況下 深淺拷貝(克隆)沒區(qū)別。

具有copy特性的類型

  • 所以整型
  • 布爾類型
  • 所以浮點型
  • 字符型 char
  • 元組(元素類型為以上幾種)

5. 所有權(quán)的轉(zhuǎn)移

函數(shù)和返回值 都可以轉(zhuǎn)移屬性

5.1 函數(shù)轉(zhuǎn)移

通過函數(shù)入?yún)?將變量移動/復(fù)制 和變量移動/復(fù)制一樣的
通過例子學(xué)習(xí)

【rust】| 06——語言特性 | 所有權(quán)
通過這個可以看到 和變量是一樣的

5.2 返回值轉(zhuǎn)移

通過返回值 轉(zhuǎn)移

【rust】| 06——語言特性 | 所有權(quán)

6. 引用和借用

有些場景我們只需要使用值 而且會多次使用 一個變量本身具有所有權(quán) 多次使用需要移動來移動去 好麻煩 有沒有辦法不要所有權(quán) 那就是通過引用的方式。

6.1 引用

引用: 使用值而不轉(zhuǎn)移(獲取)所有權(quán)
引用沒有所有權(quán)

引用通過地址來訪問存儲在該地址的數(shù)據(jù)

【rust】| 06——語言特性 | 所有權(quán)
【rust】| 06——語言特性 | 所有權(quán)
我們可以看到上面 函數(shù)定義入?yún)?s: &sring 它的含義 我們創(chuàng)建了一個引用 來接收傳入的實參引用 也稱為 借用

6.2 借用

借用 是創(chuàng)建引用的動作
借用是 不能修改引用的值

借用 顧名思義 我借了別人東西 我要原模原樣還給人家 不能說 搞壞了還吧
上demo
【rust】| 06——語言特性 | 所有權(quán)

可以看到 引用 和 默認(rèn)情況下的變量 一樣是不可變的

6.3 可變引用

引用默認(rèn)情況下 不可修改內(nèi)容 和默認(rèn)變量一樣

上面代碼因為我們定義了不可變的變量等 那我們給他給加上可變的標(biāo)志 是不是就可以變啦 是的

【rust】| 06——語言特性 | 所有權(quán)
可以看到 定義變量 函數(shù)入?yún)⒌?都修改為 可變的 少一個都不行 否者會報錯 既然要該那么都得是可變屬性哦

可變引用的約束

1、一個變量只能有一個可變引用

防止多個引用同時對一個值 修改

【rust】| 06——語言特性 | 所有權(quán)

6.4 空引用

類似空指針。
在rust中 編譯器會保證不會存在空引用。
編譯器檢測過程
【rust】| 06——語言特性 | 所有權(quán)
但我們又想用 函數(shù)內(nèi)局部變量怎么辦
前面我們學(xué)習(xí)了 返回值可以轉(zhuǎn)移所有權(quán) 那么我們返回 變量是不是就可以了
【rust】| 06——語言特性 | 所有權(quán)

7. 切片

切片也是一種引用,切片沒有所有權(quán)。
切片:對一個集合(元組 字符串) 引用其部分連續(xù)元素的操作
注: 切片不能對整個切 只能連續(xù)的某部分 是有范圍的

7.1 字符串切片

【rust】| 06——語言特性 | 所有權(quán)
我們看看切片數(shù)據(jù)的內(nèi)部存儲結(jié)構(gòu)是怎樣的
【rust】| 06——語言特性 | 所有權(quán)
可以看到切片只存儲了 起始位置的指針 和切的長度

還有一種字符串類型 &str 它指向二進(jìn)制文件 這個字符串不可變
let s=“awdada”; // s是 &str類型

7.2 其他切片

和字符串切片類似 只是切的對象換了 可以切好多
比如 切數(shù)組 引用數(shù)組中一部分元素
【rust】| 06——語言特性 | 所有權(quán)

7.3 切片的范圍

我們通過前面知道切片是如何創(chuàng)建
知道了 [ ] 方括號之間需要填切片的范圍
那么當(dāng)我們想切片的起始位置從0開始 除了 [0…x] 還有其他的表達(dá)方式

1、切片索引從0開始 的表達(dá)方式

【rust】| 06——語言特性 | 所有權(quán)

同樣的 結(jié)尾位置 也可以 用省略 表達(dá)

2、切片索引 到末尾 的表達(dá)方式

【rust】| 06——語言特性 | 所有權(quán)

3、表示整個 同理 省略起始和結(jié)尾值 [ . . ]

7.4 切片做函數(shù)參數(shù)

【rust】| 06——語言特性 | 所有權(quán)文章來源地址http://www.zghlxwxcb.cn/news/detail-443607.html

到了這里,關(guān)于【rust】| 06——語言特性 | 所有權(quán)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Rust所有權(quán)

    Rust所有權(quán)

    什么是所有權(quán) 所有程序在運行時都必須管理其使用計算機(jī)內(nèi)存的方式: 一些語言中具有垃圾回收機(jī)制,在程序運行時有規(guī)律地尋找不再使用的內(nèi)存,比如C#和Java。 在另一些語言中,程序員必須自行分配和釋放內(nèi)存,比如C/C++。 而Rust則是通過所有權(quán)系統(tǒng)管理內(nèi)存: 所有權(quán)是

    2024年02月07日
    瀏覽(24)
  • Rust-所有權(quán)(ownership)

    Rust入門學(xué)習(xí)系列-Rust 的核心功能(之一)是 所有權(quán)(ownership)。引入這個概念是為了更好的管理計算機(jī)的內(nèi)存。下面篇幅讓我們來研究下這個功能有什么神奇之處。 常見的編程語言中計算機(jī)內(nèi)存管理方式: Java:Java使用Java虛擬機(jī)(JVM)來管理計算機(jī)內(nèi)存。JVM有一個垃圾回收

    2024年02月19日
    瀏覽(31)
  • rust學(xué)習(xí)——棧、堆、所有權(quán)

    rust學(xué)習(xí)——棧、堆、所有權(quán)

    棧和堆是編程語言最核心的數(shù)據(jù)結(jié)構(gòu),但是在很多語言中,你并不需要深入了解棧與堆。 但對于 Rust 這樣的系統(tǒng)編程語言,值是位于棧上還是堆上非常重要, 因為這會影響程序的行為和性能。 棧和堆的核心目標(biāo)就是為程序在運行時提供可供使用的內(nèi)存空間。 棧 棧按照順序存

    2024年02月07日
    瀏覽(31)
  • Rust-所有權(quán)和移動語義

    Rust-所有權(quán)和移動語義

    拿C語言的代碼來打個比方。我們可能會在堆上創(chuàng)建一個對象,然后使用一個指針來管理這個對象: 接下來,我們可能需要使用這個對象: 然而,這段代碼之后,誰能猜得到,指針p指向的對象究竟發(fā)生了什么?它是否被修改過了?它還存在嗎,是否已經(jīng)被釋放?是否有另外一個指

    2024年01月18日
    瀏覽(24)
  • Rust核心功能之一(所有權(quán))

    Rust核心功能之一(所有權(quán))

    目錄 1、什么是所有權(quán)? 1.1?所有權(quán)規(guī)則 ?1.2 變量作用域 1.3 String 類型 1.4 內(nèi)存與分配 變量與數(shù)據(jù)交互的方式(一):移動 變量與數(shù)據(jù)交互的方式(二):克隆 只在棧上的數(shù)據(jù):拷貝 1.5 所有權(quán)與函數(shù) 1.6 返回值與作用域 所有權(quán)(系統(tǒng))是 Rust 最為與眾不同的特性,對語言的

    2024年02月04日
    瀏覽(35)
  • 【Rust】Rust學(xué)習(xí) 第四章認(rèn)識所有權(quán)

    【Rust】Rust學(xué)習(xí) 第四章認(rèn)識所有權(quán)

    所有權(quán)(系統(tǒng))是 Rust 最為與眾不同的特性,它讓 Rust 無需垃圾回收(garbage collector)即可保障內(nèi)存安全。因此,理解 Rust 中所有權(quán)如何工作是十分重要的。 4.1?所有權(quán) 所有運行的程序都必須管理其使用計算機(jī)內(nèi)存的方式。一些語言中具有垃圾回收機(jī)制,在程序運行時不斷地

    2024年02月13日
    瀏覽(21)
  • 30天拿下Rust之所有權(quán)

    概述 ????????在編程語言的世界中,Rust憑借其獨特的所有權(quán)機(jī)制脫穎而出,為開發(fā)者提供了一種新穎而強(qiáng)大的工具來防止內(nèi)存錯誤。這一特性不僅確保了代碼的安全性,還極大地提升了程序的性能。在Rust中,所有權(quán)是一種編譯時檢查機(jī)制,用于追蹤哪些內(nèi)存或資源何時可

    2024年03月08日
    瀏覽(24)
  • Rust語法:所有權(quán)&引用&生命周期

    Rust語法:所有權(quán)&引用&生命周期

    垃圾回收管理內(nèi)存 Python,Java這類語言在管理內(nèi)存時引用了一種叫做垃圾回收的技術(shù),這種技術(shù)會為每個變量設(shè)置一個引用計數(shù)器(reference counter),來統(tǒng)計每個對象的引用次數(shù)。 一旦某個對象的引用數(shù)為0,垃圾回收器就會擇取一個時機(jī)將其所占用的空間回收。 以Python為例子

    2024年02月12日
    瀏覽(24)
  • Rust 基礎(chǔ)入門 —— 2.3.所有權(quán)和借用

    Rust 的最主要光芒: 內(nèi)存安全 。 實現(xiàn)方式: 所有權(quán)系統(tǒng) 。 因為我們這里實際講述的內(nèi)容是關(guān)于 內(nèi)存安全的,所以我們最好先復(fù)習(xí)一下內(nèi)存的知識。 然后我們,需要理解的就只有所有權(quán)概念,以及為了開發(fā)便利,進(jìn)一步引出的引用借用概念。 內(nèi)存作為存儲程序運行時數(shù)據(jù)

    2024年02月12日
    瀏覽(28)
  • 【跟小嘉學(xué) Rust 編程】四、理解 Rust 的所有權(quán)概念

    【跟小嘉學(xué) Rust 編程】四、理解 Rust 的所有權(quán)概念

    【跟小嘉學(xué) Rust 編程】一、Rust 編程基礎(chǔ) 【跟小嘉學(xué) Rust 編程】二、Rust 包管理工具使用 【跟小嘉學(xué) Rust 編程】三、Rust 的基本程序概念 【跟小嘉學(xué) Rust 編程】四、理解 Rust 的所有權(quán)概念 本章節(jié)將講解 Rust 獨有的概念(所有權(quán))。所有權(quán)是 Rust 最獨特的特性,它使得 Rust 能夠

    2024年02月10日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包