日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

rust实现wss访问_Rust的所有权,第2部分

發(fā)布時間:2025/3/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 rust实现wss访问_Rust的所有权,第2部分 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

仍然沒有問題。

上次查看Rust的所有權(quán)時,我們查看了Rust如何使用范圍來確定何時應(yīng)該刪除或釋放內(nèi)存中的資源/數(shù)據(jù)。

我們看到,對于具有"復(fù)制特征"的類型(即,其數(shù)據(jù)可以存儲在堆棧中的類型),所有權(quán)模型的行為類似于可能使用不同范式的其他語言,例如垃圾回收。 但是對于沒有這種特征的類型,我們需要更加了解所有權(quán)規(guī)則。

盡管所有權(quán)可能會帶來一些設(shè)計折衷,但它會以靈活性,明確性和安全性來彌補。

所有權(quán)和職能

> Copy versus Move

在第一個示例中,我們首先將字符串文字(將其數(shù)據(jù)存儲在堆棧中)傳遞到函數(shù)foo()中。 在第二個示例中,我們將String類型(將數(shù)據(jù)存儲在堆中)傳遞給另一個函數(shù)foo()。 在main()和foo()的兩種實現(xiàn)中,我們都在各自的作用域中打印變量的內(nèi)存地址。

在第一個示例中,我們看到了與復(fù)制變量的值并將其綁定到新變量時類似的行為。 發(fā)生這種情況是因為字符串文字使用了堆棧。 存儲它們的指針?biāo)璧拇笮≡诰幾g時就已知道,因此,我們可以輕松地復(fù)制它的值并將其彈出到堆棧中。

這意味著每個函數(shù)main()和foo()都擁有存儲在字符串中的指針的副本。 當(dāng)foo()的作用域結(jié)束時,foo()負(fù)責(zé)刪除其自己的字符串,當(dāng)main()的作用域結(jié)束時,它也負(fù)責(zé)刪除其擁有的字符串。

另一方面,在第二個示例中,main()將字符串的所有權(quán)移到foo()中。 這意味著main()不再擁有字符串變量的所有權(quán),即它指向的內(nèi)存位置。 如果在移動main()之后嘗試從內(nèi)部訪問字符串,則會收到錯誤消息。

如示例注釋所示,Rust代替了復(fù)制(這可能會很昂貴),而是讓foo()負(fù)責(zé)內(nèi)存地址0x7efced01c010中的數(shù)據(jù)。 現(xiàn)在,只有當(dāng)foo()超出范圍時,Rust才會釋放該地址處的內(nèi)存,從而使具有指向該地址的指針的其他任何變量無效。 再次,我們這樣做是為了避免雙重釋放錯誤。

克隆,redux。

對于第二個示例,如果我們確實想復(fù)制string的值,以便main()和foo()都擁有自己的副本,類似于在堆棧上使用字符串文字時,我們可以進(jìn)行"深層復(fù)制" ,通過使用clone()方法:

> clone()

在這里,如注釋所示,main()和foo()擁有各自的字符串副本的所有權(quán)。 盡管這是一個有效的解決方案,但它并不是最有效的,因為Rust每次都需要逐步完成其堆分配過程。 有時您實際上確實希望兩個函數(shù)都與同一數(shù)據(jù)交互! (稍后會詳細(xì)介紹)。

賦予所有權(quán)

就像通過調(diào)用另一個函數(shù)并傳入變量來獲取所有權(quán)一樣,可以通過從其他函數(shù)返回來為函數(shù)賦予所有權(quán):

> Giving ownership

現(xiàn)在,foo()通過將字符串返回到調(diào)用foo()的位置來賦予main()所有權(quán)。 不出所料,只有當(dāng)main()的作用域結(jié)束時,Rust才會釋放0x7fc98be1c010。

給予與接受

如果我們遵循這種趨勢,那么我們既可以賦予所有權(quán),又可以通過接受并在foo()中返回相同的String類型來將所有權(quán)歸還給我們,這是有意義的:

> Passing ownership

但這僅僅是為了將值傳入和傳出函數(shù)而感到頭疼。 幸運的是,Rust維護(hù)者已經(jīng)考慮到了這令人頭疼:

擁有所有權(quán)然后返回所有功能的所有權(quán)有點乏味。 如果我們想讓函數(shù)使用值而不是所有權(quán)怎么辦? 很煩人的是,除了我們可能還想返回的函數(shù)主體產(chǎn)生的任何數(shù)據(jù)之外,如果我們想再次使用它,也需要將返回的信息傳遞回去。 對我們來說幸運的是,Rust具有此概念的功能,稱為參考。

—Rust書

應(yīng)用和借用

所有權(quán)可以容納數(shù)據(jù)的共享和傳遞,但是您必須遵循一些規(guī)則。

借用看起來像這樣:

main()使foo()可以訪問字符串,但是,(如標(biāo)簽所示)main()仍然是字符串的所有者。 這意味著在foo()作用域的末尾,不會從內(nèi)存中刪除字符串。 main()仍然負(fù)責(zé)字符串在內(nèi)存中的空間。

這是我們?nèi)绾卧赗ust中編寫交互的方法:

> Passing a reference/borrowing

就像我們的繪圖一樣,我們可以說main()將字符串的引用傳遞到foo()和foo()中,除了String類型引用。 用&符號表示。 在foo()的作用域結(jié)束之后,執(zhí)行返回到其調(diào)用方main(),并且字符串仍然有效。 foo()不必歸還所有權(quán),因為它從未被授予所有權(quán),它只是借來的。

"&"號表示引用,這些引用允許在不放棄所有權(quán)的情況下傳遞值! Rust知道,當(dāng)我們傳遞引用時,所有權(quán)以及因此在內(nèi)存中分配該空間的責(zé)任仍然屬于原始所有者。

Rust允許我們創(chuàng)建任意數(shù)量的引用:

> Passing multiple references of the same value

無論我們傳遞多少次對字符串的引用,所有權(quán)都會恢復(fù)為其原始所有者。 (在這種情況下,所有權(quán)返回到最初實例化字符串的位置,但是請記住,我們可以傳遞所有權(quán)然后創(chuàng)建一個引用)。

可變性

最后要提到的是可變性。 Rust通常是以實用的風(fēng)格編寫的,但作者非常務(wù)實,并了解現(xiàn)代語言并不總是如此黑白,因此Rust可以適應(yīng)可變性。

> mut

Rust允許我們使用mut關(guān)鍵字來使值可變。 注意內(nèi)存地址的更改,該更改指示必須重新分配字符串才能適合堆。

現(xiàn)在我們有了一個可變變量,我們就可以進(jìn)行可變引用了!

> Passing a mutable reference

這里的語法有點特定,但是我們看到首先需要聲明一個可變變量let mut string。 然后,當(dāng)我們使用&mut傳遞可變的引用時。 最后,我們在函數(shù)的簽名中使用&mut來明確聲明我們的函數(shù)接受可變引用。

現(xiàn)在,我們?nèi)匀豢梢源_保只負(fù)責(zé)main()負(fù)責(zé)字符串的解除分配,同時還允許其他函數(shù)對字符串進(jìn)行突變!

那些熟悉內(nèi)存管理的人可能會想到,如果不加以檢查,這將是多么危險。 如果多個函數(shù)持有一個可變的引用并嘗試異步地同時更新同一內(nèi)存位置,將會發(fā)生什么情況? 例如在使用線程時? 這導(dǎo)致數(shù)據(jù)爭用情況。

當(dāng)兩個或多個線程可以訪問共享數(shù)據(jù)并且它們試圖同時更改它們時,就會發(fā)生競爭狀態(tài)。由于線程調(diào)度算法可以隨時在線程之間交換,因此您不知道線程嘗試訪問共享數(shù)據(jù)的順序。因此,數(shù)據(jù)更改的結(jié)果取決于線程調(diào)度算法,即兩個線程都在“競爭”訪問/更改數(shù)據(jù)。

— Lehane和Amit Joki通過SO

當(dāng)使用低級語言(例如Rust)時,此問題可能會加劇。 Rust允許我們訪問原始指針,這可能會導(dǎo)致很多不安全的情況發(fā)生。

這是所有權(quán)要保護(hù)的一種事物,它通過執(zhí)行以下規(guī)則來做到這一點:"在任何給定時間,您可以擁有一個可變引用或任意數(shù)量的不可變引用。"

具有此限制的好處是Rust可以防止在編譯時發(fā)生數(shù)據(jù)爭用。 數(shù)據(jù)爭用類似于爭用條件,并且在以下三種行為發(fā)生時發(fā)生:

-兩個或多個指針同時訪問相同的數(shù)據(jù)。

-至少有一個指針用于寫入數(shù)據(jù)。

-沒有用于同步數(shù)據(jù)訪問的機(jī)制。

數(shù)據(jù)爭用會導(dǎo)致未定義的行為,并且在嘗試在運行時進(jìn)行跟蹤時可能會難以診斷和修復(fù); Rust不會發(fā)生此問題,因為它甚至不會通過數(shù)據(jù)競爭來編譯代碼!

—Rust書

Rust的所有權(quán)規(guī)則再次得以解決,這被強(qiáng)調(diào)為Rust在其他系統(tǒng)語言之上提供的核心安全功能。 這意味著Ruby程序員和我一樣,仍然不必熟悉內(nèi)存管理的內(nèi)部工作!

懸掛引用

最后一件事,當(dāng)傳遞引用時,還有另一種情況會導(dǎo)致錯誤,稱為懸掛引用。

懸掛引用是指向已釋放數(shù)據(jù)的指針,例如:

> Dangling Reference — WILL NOT COMPILE!

在此示例中,foo()返回對字符串的引用。 但是,一旦foo()的作用域結(jié)束,便會釋放字符串的內(nèi)存,這意味著引用將指向內(nèi)存中的無效位置!

Rust在編譯時通過拋出錯誤來防止這種情況。

類可以享受所有權(quán)模型的好處,而無需了解其提供的保護(hù)。 但是,能夠理解所有權(quán)只能解決的問題有助于編寫更好的代碼,而無需與編譯器抗?fàn)帯?/p>

關(guān)于Rust的所有權(quán)還有更多的東西要揭露,但是有了這兩篇文章,希望您有足夠的機(jī)會開始使用這種優(yōu)雅的解決方案來解決原本難以解決的問題。

參考資料

· Rust書

· 關(guān)于復(fù)制特性的Rust語言表單帖子

(本文翻譯自Thomas Countz的文章《Ownership in Rust, Part 2》,參考:https://medium.com/@thomascountz/ownership-in-rust-part-2-c3e1da89956e)

總結(jié)

以上是生活随笔為你收集整理的rust实现wss访问_Rust的所有权,第2部分的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久依人 | 校园激情亚洲 | 欧美一区二区 | 激情文学av| 2020亚洲男人天堂 | 嫩模啪啪| 男人都懂的网站 | 在线看片 | 私拍在线 | www.99色| 久操av在线| 亚洲淫片| 欧美一级视频免费观看 | 免费国产视频在线观看 | 国产美女91呻吟求 | 最新免费黄色网址 | 91黄色小视频 | 成人快手免费看片 | avav我爱av| 国产精品精品国产 | av波多野吉衣 | 欧美情爱视频 | 亚洲日本香蕉 | 青青草手机视频在线观看 | 91本色| 少妇人妻无码专区视频 | 91国模少妇一区二区三区 | 国产av剧情一区二区三区 | 特黄视频 | 狠狠躁夜夜躁人人爽天天高潮 | 黄色在线免费视频 | 五月婷影院| 九七超碰在线 | 在线观看黄色免费网站 | 美女黄视频网站 | 伊人草草 | 四虎少妇做爰免费视频网站四 | 波多野结衣成人在线 | 神马三级我不卡 | 色一情一交一乱一区二区三区 | 日韩欧美精品国产 | 亚洲精品~无码抽插 | 亚洲孕交 | 亚洲AV午夜精品 | 成人黄色三级视频 | 夜夜草av | 久久精品一区二区三区不卡牛牛 | 狠狠躁夜夜躁人爽 | av毛片在线免费看 | 久久草国产| 91亚洲精品乱码久久久久久蜜桃 | 法国空姐在线观看视频 | 瑟瑟在线视频 | 911香蕉 | 日本在线播放视频 | 久久精品视频在线免费观看 | 久久偷拍免费视频 | 国产在线专区 | www.狠狠撸.com | 向日葵视频在线 | 日韩精品视频在线 | 日韩欧美麻豆 | 一二三区精品 | 国产一区二区av | 日本黄色免费视频 | 国产三级自拍视频 | 日本欧美在线播放 | 亚州精品国产精品乱码不99按摩 | 色呦呦在线免费观看 | 亚洲av毛片一区二二区三三区 | 日本丰满熟妇videossex一 | 国产91一区二区三区在线精品 | 麻豆免费在线观看 | 日韩精品电影一区二区三区 | 男女视频一区二区 | 99激情视频 | 免费黄色小视频在线观看 | 热玖玖| 国产亚洲精品精品精品 | 特黄a级片 | 欧美大尺度床戏做爰 | 欧美肉丝袜videos办公室 | 国内av在线| 中国极品少妇xxxx做受 | 亚洲午夜久久久久久久久红桃 | 东北少妇不带套对白 | 亚洲图片一区 | 在线色综合 | 中文字幕黄色av | 麻豆电影网站 | 天天操夜操 | 国产精品一区二区三区在线免费观看 | 久久99精品久久久久久园产越南 | 99热精品在线播放 | 精品人妻一区二区三区潮喷在线 | 好吊日在线观看 | 图书馆的女友在线观看 | 一个人免费在线观看视频 | 久久婷婷成人综合色 |