日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

Rust所有權(quán)與借用檢查:編譯期內(nèi)存管理實踐

Rust所有權(quán)與借用檢查:編譯期內(nèi)存管理實踐 寫 Rust 這幾年被問得最多的一句話就是“所有權(quán)到底是個啥”。我一直覺得這個中文譯名有點誤導(dǎo)聽起來像某種法律概念實際上它描述的是一件特別樸素的事一塊內(nèi)存由誰負(fù)責(zé)釋放、什么時候釋放、釋放之前誰有資格讀寫。C 里這件事靠人腦記賬Java、Go 里這件事交給運行時在后臺掃Rust 選了第三條路——把賬本寫進(jìn)類型系統(tǒng)讓編譯器在編譯期替你記。代價是你得學(xué)會跟編譯器講道理收益是運行時沒有停頓、沒有懸垂指針、沒有雙重釋放單線程代碼里的迭代器失效問題基本絕跡。這篇筆記把所有權(quán)、借用檢查、生命周期標(biāo)注、智能指針這幾塊串起來講重點放在“它怎么影響內(nèi)存管理”這個角度而不是復(fù)述語法手冊。適合已經(jīng)能寫點 Rust 但總被借用檢查器攔下來的人也適合從 C 或 Go 轉(zhuǎn)過來、想搞清楚心智模型差異的人。下面所有報錯和改法都是我實際踩過的代碼可以直接抄去跑。1. 三種內(nèi)存管理路線Rust 為什么挑了最難的這條1.1 手動管理與垃圾回收各自的賬單先把三條路擺在桌面上對比不然后面很多設(shè)計取舍會顯得莫名其妙。手動管理C、C 的裸指針路線把釋放時機完全交給開發(fā)者性能上限最高內(nèi)存布局最可控代價是任何一次疏忽都會變成線上事故而且這類事故往往在壓力大的時候才暴露。垃圾回收J(rèn)ava、Go、C# 的默認(rèn)路線把釋放交給運行時開發(fā)者寫得舒服代價是內(nèi)存占用曲線偏高延遲不可預(yù)測遇到大堆的時候一次回收能帶來幾十毫秒的抖動。Rust 的所有權(quán)系統(tǒng)是第三條路編譯器在編譯期為每個值推導(dǎo)出唯一的負(fù)責(zé)方負(fù)責(zé)方離開作用域就自動釋放檢查全部發(fā)生在編譯期運行時不需要任何額外指令。路線釋放時機運行時開銷典型風(fēng)險延遲可預(yù)測性手動管理開發(fā)者調(diào)用 free/delete接近零懸垂指針、雙重釋放、泄漏高垃圾回收運行時掃描判定5% 到 30% 不等看堆大小停頓抖動、內(nèi)存峰值高低所有權(quán)系統(tǒng)作用域結(jié)束自動 drop編譯期檢查運行時為零學(xué)習(xí)曲線、改寫數(shù)據(jù)結(jié)構(gòu)高這張表里最關(guān)鍵的一列是“運行時開銷”。Rust 的所有權(quán)檢查在編譯完成后就消失了生成的機器碼里沒有任何一條指令是用來“檢查所有權(quán)”的這叫零成本抽象。你付出的是編譯期的思考成本和偶爾的改寫成本換來的是運行時的確定性。1.2 所有權(quán)本質(zhì)上是一套編譯期推導(dǎo)出來的引用計數(shù)我習(xí)慣用引用計數(shù)來類比所有權(quán)這個類比能解釋掉八成的疑惑。真正的引用計數(shù)比如RcT是在運行時維護一個整數(shù)每次克隆加一每次銷毀減一減到零就釋放。所有權(quán)系統(tǒng)做的事情幾乎一樣區(qū)別在于編譯器在編譯期就能推導(dǎo)出每個值的引用計數(shù)永遠(yuǎn)是 0 或 1既然結(jié)果只有兩種那就不需要在運行時存這個整數(shù)了直接把它編碼進(jìn)類型檢查規(guī)則里。所以String被賦值給另一個變量之后原變量立刻失效——因為在編譯器的賬本上這個值的所有者已經(jīng)換人了舊主人再訪問就是越權(quán)。這個類比還能解釋另一個現(xiàn)象為什么RcT在 Rust 里被歸到“智能指針”而不是“所有權(quán)”里。因為一旦你真的需要多個所有者編譯期就沒法推導(dǎo)出唯一負(fù)責(zé)方了只能退回到運行時記賬這就是Rc和Arc存在的原因。理解了這個層次關(guān)系你就不會覺得RcRefCellT是一堆奇怪符號的堆砌而會明白它是“編譯期賬本不夠用時的降級方案”。1.3 編譯期到底擋住了哪幾類事故具體一點所有權(quán)加借用檢查主要攔四類問題。第一類是釋放后使用C 里指針指著的內(nèi)存已經(jīng)被free掉讀出來是臟數(shù)據(jù)Rust 里編譯器直接告訴你這個值已經(jīng) move 走了。第二類是雙重釋放兩個指針指向同一塊堆內(nèi)存析構(gòu)函數(shù)跑兩遍堆管理器直接崩Rust 里因為只有一個所有者drop只會執(zhí)行一次。第三類是迭代器失效這是 C 里最陰的一類 bug往vector里push_back之后原來的迭代器可能指向已釋放的舊緩沖區(qū)Rust 里你在遍歷v的同時調(diào)v.push()會直接編譯失敗。第四類是數(shù)據(jù)競爭多個線程同時讀寫同一塊內(nèi)存且沒有同步Rust 靠Send和Sync兩個標(biāo)記 trait 在編譯期就把不安全的共享擋掉。我印象最深的是第三類。早年寫 C 的時候在一個循環(huán)里刪元素導(dǎo)致迭代器失效程序在小數(shù)據(jù)量下跑得好好的上線之后數(shù)據(jù)量上來才開始隨機崩潰查了兩天才定位到。換成 Rust 之后這種寫法連編譯都過不去等于把調(diào)試成本從線上挪到了敲代碼的那幾分鐘。2. 三條鐵律落地move、Copy、Clone 在內(nèi)存里到底做了什么2.1 三條規(guī)則逐條對照內(nèi)存行為所有權(quán)的規(guī)則只有三條但每一條都對應(yīng)著實實在在的內(nèi)存動作。第一條每個值有且只有一個所有者。第二條同一時刻只能有一個所有者。第三條所有者離開作用域值被丟棄。這三條合起來的效果是任何一塊堆內(nèi)存的釋放點都是唯一且確定的編譯器在生成代碼的時候就知道該在哪里插入釋放調(diào)用不需要運行時判斷。拿String舉例。let s1 String::from(hello);這一行會在棧上放一個三元組指針、容量、長度在堆上放五個字節(jié)的數(shù)據(jù)。接著let s2 s1;這一行做的事情是把棧上那 24 個字節(jié)復(fù)制一份給s2堆上的數(shù)據(jù)一個字節(jié)都不動然后編譯器在符號表里把s1標(biāo)記為失效。如果你這時候?qū)憄rintln!({}, s1)編譯器報 E0382意思是使用了已經(jīng) move 走的值。注意這里沒有發(fā)生任何堆內(nèi)存分配或復(fù)制move 對String這類類型來說是常數(shù)時間操作。2.2 move 不是“搬家”是所有權(quán)憑證的轉(zhuǎn)移很多人以為 move 會把堆上的數(shù)據(jù)搬到新地址這是個誤解。move 搬的只是棧上那個描述符堆數(shù)據(jù)原地不動。這也解釋了為什么對大對象做 move 是廉價的VecT裝一百萬個元素move 一次也只復(fù)制 24 個字節(jié)的頭部。真正昂貴的是clone那才是老老實實把堆數(shù)據(jù)復(fù)制一份。我用一段代碼把這個差別量化一下你可以直接跑fn main() { let v1: Vecu64 (0..1_000_000).collect(); let start std::time::Instant::now(); let v2 v1; // move只復(fù)制頭部 println!(move 耗時: {:?}, start.elapsed()); let start std::time::Instant::now(); let v3 v2.clone(); // clone復(fù)制全部堆數(shù)據(jù) println!(clone 耗時: {:?}, start.elapsed()); println!({} {}, v3.len(), std::mem::size_of::Vecu64()); }實測下來 move 通常是納秒級clone 一百萬個u64大概在幾百微秒到一毫秒之間取決于內(nèi)存帶寬。這個差距在高頻路徑上是致命的所以我養(yǎng)成一個習(xí)慣函數(shù)簽名里能傳引用就傳引用確實需要轉(zhuǎn)移所有權(quán)才用 move絕不為了圖省事到處寫.clone()。2.3 Copy 與 Clone 的邊界怎么劃Copy和Clone經(jīng)常被混為一談其實差別很大。Copy是一個標(biāo)記 trait表示這個類型的值可以按位復(fù)制賦值之后原變量依然可用。能實現(xiàn)Copy的類型有兩個硬性條件所有字段都是Copy并且這個類型本身沒有實現(xiàn)Drop。整數(shù)、浮點數(shù)、布爾、字符、裸指針、以及由它們組成的固定大小數(shù)組和元組都是Copy的。String、VecT、BoxT都不是因為它們管理著堆內(nèi)存按位復(fù)制會導(dǎo)致兩個所有者指向同一塊堆這正是所有權(quán)系統(tǒng)要避免的。Clone則是一個普通 trait需要你顯式調(diào)用.clone()它允許你自定義復(fù)制邏輯比如深拷貝堆數(shù)據(jù)。任何類型都可以實現(xiàn)Clone包括實現(xiàn)了Drop的類型。這里有個常見的性能坑給一個大結(jié)構(gòu)體derive(Clone)之后在循環(huán)里順手寫.clone()傳參編譯器不會提醒你代碼跑起來才發(fā)現(xiàn)慢得離譜。我的做法是只有在確實需要獨立副本的地方才 deriveClone而且在大結(jié)構(gòu)體上會刻意不 derive逼著自己去想清楚到底該傳引用還是轉(zhuǎn)移所有權(quán)。順便說一個實測有用的小技巧用std::mem::size_of快速看一眼類型的棧上開銷很多“為什么這個結(jié)構(gòu)體這么大”的疑惑一測就清楚了fn main() { println!(String {}, std::mem::size_of::String()); // 24 println!(str {}, std::mem::size_of::str()); // 16 println!(Boxu64 {}, std::mem::size_of::Boxu64()); // 8 println!(OptionBoxu64 {}, std::mem::size_of::OptionBoxu64()); // 8 println!(Rcu64 {}, std::mem::size_of::Rcu64()); // 8 }OptionBoxT只占 8 字節(jié)這件事值得單獨說一下。編譯器發(fā)現(xiàn)Box的指針不可能是零于是用空指針這個非法值來表示None這叫空指針優(yōu)化。這個優(yōu)化在鏈表、樹這類遞歸結(jié)構(gòu)里非常關(guān)鍵不然每個節(jié)點都要多帶一個字節(jié)的判別位再加對齊填充內(nèi)存占用會明顯上升。2.4 函數(shù)簽名就是一份所有權(quán)契約我一直建議新手把函數(shù)簽名當(dāng)成一份合同來讀。參數(shù)寫T表示調(diào)用方把這個值的所有權(quán)交出去了函數(shù)返回之后調(diào)用方不能再碰它寫T表示只借來讀函數(shù)內(nèi)部改不了寫mut T表示借來改借用期間調(diào)用方不能用寫self和mut self是同樣的道理只是作用在方法接收者上。一份好的簽名應(yīng)該讓調(diào)用方一眼看出“我還能不能用這個變量”。fn consume(s: String) - usize { s.len() } // 拿走所有權(quán) fn inspect(s: str) - usize { s.len() } // 只借用讀 fn append(s: mut String, tail: str) { s.push_str(tail); } // 借用改 fn create() - String { String::from(new) } // 交出所有權(quán)這四行基本覆蓋了九成場景。我踩過的一個坑是函數(shù)參數(shù)寫成String但其實只讀一下長度結(jié)果調(diào)用方每次都得 clone 一份才能傳進(jìn)去。改成str之后String和字符串字面量都能直接傳調(diào)用方省掉了所有 clone。這個改動看起來小在一個熱路徑上能省掉可觀的分配次數(shù)。3. 借用檢查器到底在檢查什么3.1 共享不可變、獨占可變借用規(guī)則只有一句話任意時刻你要么擁有多個不可變引用要么擁有一個可變引用兩者不能同時存在。另外所有引用必須始終有效。這條規(guī)則的動機有兩個層次。淺層是為了防止數(shù)據(jù)競爭多個線程同時讀是安全的只要有寫就必須獨占。深層是為了防止同一份數(shù)據(jù)在讀取過程中被別處改掉導(dǎo)致讀到的內(nèi)容前后不一致。舉一個最典型的例子遍歷的同時修改集合fn main() { let mut v vec![1, 2, 3]; for x in v { if *x 2 { v.push(4); // 報錯 E0502 } } }編譯器會告訴你v已經(jīng)被不可變借用不能再作為可變借用。這個限制在 C 里是允許的代價是push可能觸發(fā)重新分配原來的迭代器變成懸垂指針接著就是未定義行為。Rust 直接把這條路堵死。正確的寫法是先收集要改的內(nèi)容循環(huán)結(jié)束后再統(tǒng)一改fn main() { let mut v vec![1, 2, 3]; let need_push v.iter().any(|x| x 2); if need_push { v.push(4); } }這種“先讀后寫”的拆分模式我用了無數(shù)次幾乎所有的借用沖突都能用這個思路化解。它看起來多寫了一行實際上是把原本隱藏的時序依賴顯式化了代碼反而更清楚。3.2 NLL 讓借用的結(jié)束點變聰明了早期的 Rust 用詞法作用域判斷借用何時結(jié)束只要變量還在作用域里借用就算沒結(jié)束于是很多寫法通不過。從 2018 edition 開始默認(rèn)啟用非詞法生命周期NLL借用的有效期縮短到“最后一次使用”為止。這個改進(jìn)影響巨大很多以前必須用花括號強行劃作用域的代碼現(xiàn)在可以直接寫。fn main() { let mut data vec![1, 2, 3]; let first data[0]; println!({}, first); // first 的最后一次使用 data.push(4); // 現(xiàn)在合法了借用已經(jīng)結(jié)束 println!({:?}, data); }這段代碼在老版本會報錯因為data的可變借用和first的不可變借用被認(rèn)為在同一個作用域里共存。NLL 之后編譯器看出first在println之后就沒用了借用提前結(jié)束后面的push就不沖突了。理解這一點很重要它意味著你不需要為了繞開借用檢查而寫一堆莫名其妙的花括號只要讓借用自然地在最后一次使用處結(jié)束就行。3.3 生命周期標(biāo)注不延長壽命只是描述關(guān)系生命周期這個詞嚇退過不少人其實它的作用被嚴(yán)重夸大了。生命周期標(biāo)注不會讓任何值的存活時間變長或變短它只是告訴編譯器“這幾個引用之間的存活關(guān)系是這樣的”方便編譯器做檢查。真正決定值活多久的永遠(yuǎn)是它所在的作用域。最經(jīng)典的例子是返回兩個字符串切片里較長的那個fn longesta(x: a str, y: a str) - a str { if x.len() y.len() { x } else { y } }不寫標(biāo)注的話編譯器報 E0106因為它無法確定返回的引用到底跟著x還是y活。a的意思是返回值的存活時間不會超過x和y中較短的那個。這是一個上界約束不是延長。調(diào)用方拿到返回值之后只要保證在x和y都還活著的時候用它就行。生命周期省略規(guī)則有三條記住這三條能省掉大部分手寫標(biāo)注。第一每個引用參數(shù)各自獲得一個獨立的生命周期參數(shù)。第二如果只有一個輸入引用參數(shù)那么輸出的生命周期全部等于它。第三如果有self或mut self那么輸出的生命周期全部等于self的。第三條是方法簽名的常用規(guī)則所以大多數(shù)方法不需要手寫生命周期標(biāo)注。3.4 結(jié)構(gòu)體持有引用必須寫生命周期這是新手最容易卡住的地方。結(jié)構(gòu)體里如果放了引用就必須給結(jié)構(gòu)體加生命周期參數(shù)因為編譯器需要確保這個引用比結(jié)構(gòu)體本身活得久。否則結(jié)構(gòu)體還存在的時候它指向的數(shù)據(jù)可能已經(jīng)被釋放了。struct Tokena { text: a str, line: usize, } impla Tokena { fn len(self) - usize { self.text.len() } }Tokena讀作“這個 Token 的有效期不能超過a”。這意味著任何持有Token的地方那個被引用的字符串也得活著編譯器會一路向上檢查。這個傳播有時候會很煩一個底層結(jié)構(gòu)加了生命周期上面三層都得跟著加。我的處理策略是分場景的。如果這段數(shù)據(jù)是短命的、臨時的、解析完就用完的那就老老實實加生命周期零拷貝最快。如果這段數(shù)據(jù)要被存起來、跨函數(shù)傳遞、或者放進(jìn)集合里長期持有那就直接存String用一次分配換掉整條鏈上的生命周期標(biāo)注。這個取舍在下一節(jié)的實戰(zhàn)案例里會詳細(xì)展開。4. 智能指針編譯期賬本不夠用的時候4.1 Box、Rc、Arc、RefCell 各自解決什么問題所有權(quán)的默認(rèn)模型是單一所有者加獨占可變這個模型覆蓋了大部分場景但確實有幾類需求它表達(dá)不了需要在堆上分配且大小在編譯期未知的遞歸類型、需要多個所有者共享同一份數(shù)據(jù)、需要在只有不可變引用的前提下修改內(nèi)容。這三種需求分別對應(yīng)Box、Rc/Arc、Cell/RefCell。類型所有權(quán)模型線程安全運行時開銷典型場景BoxT獨占堆分配取決于 T一次分配遞歸結(jié)構(gòu)、trait 對象RcT共享非原子計數(shù)否每次克隆加減一單線程共享只讀數(shù)據(jù)ArcT共享原子計數(shù)是T: SendSync原子操作比 Rc 慢多線程共享CellT內(nèi)部可變按值替換否幾乎為零小 Copy 類型的可變狀態(tài)RefCellT內(nèi)部可變運行時借用檢查否借用標(biāo)志位增減需要在 self 里改內(nèi)容選型的順序我一般是這樣的先問是不是遞歸類型或需要 trait 對象是就上Box再問是不是真的需要多個所有者如果只是讀取共享用Arc包只讀數(shù)據(jù)就夠了別急著上RefCell最后才問是不是需要在不可變引用下修改需要才用RefCell。很多人一上來就寫RcRefCellT其實八成場景用RcT或者干脆傳引用就能解決白白引入了運行時開銷和 panic 風(fēng)險。4.2 Rc 加 RefCell 的代價具體在哪RcT的每次clone都要對引用計數(shù)做一次加一每次drop做一次減一減到零才釋放。這些操作在單線程里是普通的整數(shù)加減開銷很小但不為零。RefCellT則維護一個借用計數(shù)器borrow()時檢查當(dāng)前有沒有可變借用有就 panicborrow_mut()時檢查計數(shù)器是不是零不是零也 panic。這兩個檢查都是運行時分支編譯器沒法優(yōu)化掉。更需要注意的是循環(huán)引用導(dǎo)致的內(nèi)存泄漏。兩個Rc互相指向引用計數(shù)永遠(yuǎn)不會歸零內(nèi)存就漏了。標(biāo)準(zhǔn)解法是把其中一個方向改成Weakuse std::cell::RefCell; use std::rc::{Rc, Weak}; struct Node { value: i32, next: OptionRcRefCellNode, prev: OptionWeakRefCellNode, // 用 Weak 打破環(huán) } fn main() { let a Rc::new(RefCell::new(Node { value: 1, next: None, prev: None })); let b Rc::new(RefCell::new(Node { value: 2, next: None, prev: Some(Rc::downgrade(a)) })); a.borrow_mut().next Some(Rc::clone(b)); println!(a 的強引用數(shù): {}, Rc::strong_count(a)); println!(a 的弱引用數(shù): {}, Rc::weak_count(a)); }Weak不增加強引用計數(shù)升級成Rc的時候要調(diào)upgrade()返回Option因為目標(biāo)可能已經(jīng)被釋放了。這個模式在雙向鏈表、樹結(jié)構(gòu)里都會用到我建議只要結(jié)構(gòu)里出現(xiàn)“指回去”的邊就默認(rèn)用Weak不要等到內(nèi)存漲上去才回頭改。4.3 有時候該退一步換數(shù)據(jù)結(jié)構(gòu)而不是堆智能指針這是我踩過的最大的一個坑。早期寫一個圖結(jié)構(gòu)的處理邏輯習(xí)慣性地用RcRefCellNode表示每個節(jié)點節(jié)點之間互相引用。代碼能跑但性能很差而且一旦涉及并發(fā)就完全沒法用因為Rc根本不是Send。后來改成用VecNode存所有節(jié)點節(jié)點之間用usize索引互相引用性能提升非常明顯代碼也短了。struct Graph { nodes: VecNode, } struct Node { edges: Vecusize, // 索引而不是引用 }索引方案的代價是你得自己保證索引有效刪節(jié)點的時候要處理懸空索引。但它換來的是連續(xù)的堆布局、零引用計數(shù)開銷、天然的Send Sync而且序列化也簡單得多。我現(xiàn)在的判斷標(biāo)準(zhǔn)是如果一個數(shù)據(jù)結(jié)構(gòu)里RcRefCell出現(xiàn)超過兩處就該停下來想想是不是該用索引或者 arena 了。5. 一個真實場景的重構(gòu)從編譯不過到跑得穩(wěn)5.1 需求解析文本并緩存字段假設(shè)要寫一個小模塊從多行文本里解析出鍵值對緩存起來供后續(xù)查詢。第一版我圖省事直接讓結(jié)構(gòu)體持有輸入的切片struct Configa { entries: Vec(a str, a str), } impla Configa { fn parse(input: a str) - Self { let mut entries Vec::new(); for line in input.lines() { if let Some((k, v)) line.split_once() { entries.push((k.trim(), v.trim())); } } Config { entries } } fn get(self, key: str) - Optiona str { self.entries.iter().find(|(k, _)| *k key).map(|(_, v)| *v) } }這段代碼能編譯get返回的引用直接指向原始輸入零拷貝速度很快。問題出在調(diào)用方那邊一旦把input的所有權(quán)交出去或者input是函數(shù)內(nèi)部臨時構(gòu)造的String就出事了。5.2 第一版在真實調(diào)用鏈里崩了調(diào)用方大概是這樣的fn load() - Configstatic { let content std::fs::read_to_string(config.txt).unwrap(); Config::parse(content) // 報錯返回引用了局部變量 }編譯器報 E0515說不能返回指向局部變量的引用。這不是編譯器的刁難content在函數(shù)結(jié)束時就 drop 了返回的Config里那些指針會立刻變成懸垂指針。如果這段代碼在 C 里寫編譯能過運行時讀到的就是垃圾數(shù)據(jù)而且可能好幾個月都不出問題直到某次內(nèi)存布局變化才突然炸。第二版我把結(jié)構(gòu)體改成持有Stringstruct Config { entries: Vec(String, String), } impl Config { fn parse(input: str) - Self { let mut entries Vec::new(); for line in input.lines() { if let Some((k, v)) line.split_once() { entries.push((k.trim().to_string(), v.trim().to_string())); } } Config { entries } } fn get(self, key: str) - Optionstr { self.entries.iter().find(|(k, _)| k key).map(|(_, v)| v.as_str()) } }這樣寫能跨函數(shù)傳遞、能存進(jìn)集合、能放進(jìn)Arc里共享代價是每個鍵值對兩次堆分配。對于配置文件這種一次性加載、長期駐留的場景這個代價完全值得。但如果是解析大文件做流式處理每行兩次分配就有點浪費了。5.3 第三版用 Cow 做折中Cow寫時克隆是這兩者之間的折中方案。它在不需要修改的時候借用原始數(shù)據(jù)需要修改的時候才分配use std::borrow::Cow; enum Entrya { Borrowed(a str), Owned(String), } fn normalize(s: str) - Cow_, str { if s.contains(\t) { Cow::Owned(s.replace(\t, )) } else { Cow::Borrowed(s) } }Cowa, str是標(biāo)準(zhǔn)庫提供的枚舉只有Borrowed和Owned兩個變體。它的好處是調(diào)用方不用關(guān)心底層到底是借用還是擁有用.as_ref()或Deref就能當(dāng)str用。壞處是它仍然帶著生命周期參數(shù)跨函數(shù)邊界的時候該傳播還得傳播而且枚舉本身占的??臻g比單純的str大具體多大可以用size_of實測一下不同版本和優(yōu)化下會有差異。我現(xiàn)在的選擇順序是數(shù)據(jù)生命周期短、調(diào)用鏈淺用str加生命周期數(shù)據(jù)要被長期持有、跨線程傳遞用String兩者之間搖擺不定的中型場景用Cow。這個順序不是教條但你照著走能少走彎路。6. 高頻報錯與排查速查6.1 錯誤碼對照表被借用檢查器攔住的時候先看錯誤碼再看提示里的“誰的借用還沒結(jié)束”。下面這張表是我整理的高頻錯誤基本上覆蓋了日常八成的情況。錯誤碼含義典型改法E0382使用了已經(jīng) move 的值改傳引用或在轉(zhuǎn)移前 cloneE0499同一作用域內(nèi)兩次可變借用拆分成兩個階段或用索引代替引用E0502可變借用與不可變借用沖突先讀后寫或縮短不可變借用的生命周期E0505借用還沒結(jié)束就要 move讓借用先結(jié)束再 moveE0515返回了局部變量的引用返回?fù)碛兴袡?quán)的類型E0597被借用的值活不到那么久調(diào)整作用域順序或改為擁有E0716臨時值在借用期間被釋放先用 let 綁定成變量再借用E0106缺少生命周期標(biāo)注按省略規(guī)則補上或改成擁有類型E0716 值得單獨提一句很多人寫過類似的代碼然后一臉茫然fn main() { // let s String::from(hello).as_str(); // 報錯 E0716 let tmp String::from(hello); // 先綁定成變量 let s tmp.as_str(); // 再借用 println!({}, s); }原因是String::from(hello)產(chǎn)生的臨時值在這一行結(jié)束時就被 drop 了as_str()借出來的引用立刻懸垂。先綁定到tmp之后tmp活到作用域結(jié)束借用才合法。這類問題的排查思路很統(tǒng)一看那個被借用的值是不是臨時值是就給它一個名字。6.2 排查順序先找誰借了誰再看誰要活多久我處理借用錯誤的固定流程是這樣的。第一步看錯誤提示里點名的變量確認(rèn)是“值被 move 了”還是“借用沖突”。第二步如果是借用沖突從報錯位置往上找找最后一個使用這個引用的地方那里就是借用結(jié)束的位置。第三步如果想讓借用提前結(jié)束就把后面的寫操作挪到那之后或者把讀的結(jié)果先取出來存成獨立的值。第四步如果怎么調(diào)都不行說明數(shù)據(jù)結(jié)構(gòu)的所有權(quán)模型設(shè)計有問題考慮換成索引、Rc或者擁有類型。這個流程里第三步最常用。舉一個我經(jīng)常遇到的場景需要在HashMap里查一個值然后修改它use std::collections::HashMap; fn main() { let mut map: HashMapString, i32 HashMap::new(); map.insert(a.to_string(), 1); // let v map.get(a).unwrap(); // map.insert(b.to_string(), 2); // 報錯 E0502 // println!({}, v); let v map.get(a).copied().unwrap_or(0); // 先取值結(jié)束借用 map.insert(b.to_string(), 2); println!({}, v); }copied()把Optioni32變成Optioni32借用當(dāng)場結(jié)束后面的插入就自由了。這個技巧在處理哈希表、緩存的時候特別好用我基本養(yǎng)成了習(xí)慣只要借出來的值很小且 Copy先拷貝再用。6.3 幾條踩出來的實操心得第一別怕加花括號。雖然 NLL 已經(jīng)聰明很多但在某些復(fù)雜表達(dá)式里顯式劃一個作用域讓借用提前結(jié)束比絞盡腦汁調(diào)整順序省事得多。第二clone()不是洪水猛獸在冷路徑上用 clone 換代碼清晰度是完全劃算的我反對的是在熱循環(huán)里無意識地 clone。第三遇到RcRefCellT的borrow_mutpanic先找有沒有在同一段代碼里同時持有兩個借用尤其是鏈?zhǔn)秸{(diào)用里臨時值還沒釋放的情況把中間結(jié)果用let綁定出來往往就好了。第四函數(shù)簽名優(yōu)先用借用只有在確實需要保存或跨線程的時候才用擁有類型這條規(guī)則能讓你的模塊接口干凈很多。第五如果一段邏輯里到處都是unsafe或者反射式的類型轉(zhuǎn)換那多半不是所有權(quán)的問題是數(shù)據(jù)結(jié)構(gòu)選錯了回頭看看第 4.3 節(jié)。關(guān)于內(nèi)存管理我個人在實際操作中最深的一點體會是所有權(quán)系統(tǒng)真正改變的不是你寫代碼的語法而是你設(shè)計數(shù)據(jù)結(jié)構(gòu)的方式。寫 C 的時候我會自然地想“這塊內(nèi)存誰 free”寫 Java 的時候基本不想寫 Rust 之后我會在動手寫第一行之前就想清楚“這個值的生命周期有多長、誰能改它、要不要共享”。這個思考前置的過程一開始很別扭習(xí)慣之后反而省掉了大量調(diào)試時間因為很多問題在敲代碼的時候就已經(jīng)被逼著想明白了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
北条麻妃99精品青青久久| 欧美精品99久久久**| 久久久精品视频免费观看| 青青操在线亚洲视频观看欧美在线 | 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 91综合在线| …中文字幕亚洲乱,97人妻无码费视…| 蜜桃视频成a人v在线| 磁力99AV| 青青草天天亲夜夜操网| 欧美人妻少妇| 老司机午夜福利视频一区二区| 国产对白刺激视频| 亚洲日本天堂| 久热这里| 亚欧无码线免费观看视频| 亚洲 图片 综合91| 国产色精品午夜大片| 欧美丝袜美女电影一二三四区| 亚洲av综合色区无码一| 伊人久久AV诱惑悠悠| 日韩99999色| 偷拍三区| 中国91AV| 中 文字幕一区二区三四 五 区日 日 骚| 国产乱伦亚洲色图高清无码| 久99在线免费观看视频| 国产男女无套97| 久久AV无码网址| 精品人妻15区| 亚洲欧洲无码97久久精品| 国产区性爱在线视频秋霞豆| 日韩三级伊人| 熟女91网| 中美日韩毛片| 日本福利二区视频| 成人午夜高潮av猛片| 亚洲色图第一页| 国产成人亚洲精品自产在线| 欧美性生活免费网| 欧美爱爱97| 欧美综合777| 天天干天天插| 美中日韩无码| 国产A v无码专区| 国产成人五月天丁香花| 亚洲熟久久| 丰满人妻一区二区三区免费,| 无码一区免费在线不卡| 99999久久精| 丝袜av一区二区三区| 亚洲另类在线观看| 亚洲av强奸乱伦| 最新岛国大片| 艹少妇网站| 欧美特大AA级黄片| 日韩熟女乱伦中出| 精品国产无码中文| 色波多| 麻豆一区二区三区在线看| 欧美97日韩| 久久国产精品91| 婷婷丁香五月综合| 精品黑人一区二区| www.91久久| 日韩不卡av一二三| 亚洲综合一区二区| 操一区| 强奸a片网| 天天色综亚洲91污| 97摸视频| 色欲久久综合| 97人人超| 亚洲av强奸乱伦| 欧美在线干| www.色婷婷色综合| 国内三级自拍小视频在线观看| 另类 日韩 熟女| 少妇人妻太紧太深av| 成年无码动漫av片无尽在线| 污色区网站| 亚洲中文字幕精品一区| 操逼操操操91| 99热这里只有精品8| 综合网色| 欧洲天天在线| 综合网久久| 亚洲男人的天堂AV| 欧美午夜熟妇黑人精品91| 日本精品加勒比海一区| 精品九九九九九九| 天天看天天日| 无码操逼视频一下| 午夜精品五区| 欧美色五月| 欧美少妇大量自拍视频在线观看| 久久最新视频免费观看| 色综合久久夜色精品国产天堂| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 男女激情黄色网址| 人人考人人摸人人干| 一块操欧美性爱| 综合色99| 日本一区二区三区精品| 人人操人人肉久久精品| 一级特黄aaa大片在线观看成人一级片在线观看| 精品久久无码午夜福利| 亚洲av淫乱| 久久99热这里只频精品6学生| 欧美日不卡| 久久久久中出| 欧美日韩亚洲电影| 91成人18| 久久社区一区二区三区| 天天摸,夜夜摸| 天天天天做夜夜夜夜做| 91亚洲网站| 99久久精品无码一区二区毛片免费| 久久久精品91八戒| 婷婷五月天影院| 亚洲免费精品一区| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 天天综合网~91综合网| 诱惑网综合| 中文字幕乱码人妻二区三区| 色婷婷综合网站| 嗯嗯啊啊用力视频免费| 精品夜夜澡人妻无码AV| 神马久久久久久伦理片| 一本正道久久熟女| 欧美美女视频| 乱伦系列一区二区| 久久熟女久| 丝袜亚洲综合| 丁香五月久久| 欧美综合传媒| 丰满人妻一区二区三区四区| 97 亚洲 日韩 欧美 在线| 九九热午夜欧亚国产视频| 免费试看60秒| 91色碰| 色网亚洲人| 综合五月婷婷亚洲一区| 国产嫩草精品A88AV在线| 欧美草草| 亚洲日韩精品一区视频在线| WWW.加勒比人妻一区不卡.com| 密臀视频三区免费网站| 操逼网免费无码视频| 人妻密肉在线观看| 天天综合网在线观看| 久草网站免费在线观看| 丝袜美腿校园春色| 99e久久国产精品| 蜜臀久久99精品久久久久久久久| 91精品国产一区三一| 国产一级αv免费看片| 男人天堂日日夜夜| 久久亚洲国产成人| 日韩内射视频| 久久这里只精品免费福利| 成人综合色网| 手机看片91人妻| 九九热九九热| 日本性爱欧美性爱| 人妻酒店出差被中出免费在线播放| 中文字幕精品免费一区二区| 天天综合有色网| 无码不卡亚洲成?人片| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 日韩女优中文字幕| 日本操逼无码| 99RE在线视频精品,这里只有精品| 97视频在线看| 中国一级αV| 成人av免费观看| 色偷综合| 国产精品一级毛片不卡视| 97国产天堂岛| 一区二区三区精品视频| 激情婷婷黑人91| 色噜噜人妻丝袜a∨先锋影 | 欧美日韩性爱视屏免费看了| 超碰导航97| 激情综合五月| 日本精品五区| 九X超碰| 国产精品极品美女视频| 亚欧美无遮挡| 精品超碰中文在线| se吧提供91精品国产91久久久久久| 亚洲综合888| 国产操逼视频在线观看| 一区二区不卡免费| 日本东京热大香蕉a片| 精品亚洲国产成人精品| 男人的天堂va| 欧美亚洲激情一二三| 熟妇操花| 一区二区三区国产在线播放| 色哟哟1区2区| 人妻熟女午夜精品在线| 亚洲色图欧美色图日韩色图| 亚洲欧美清纯| 欧美91精彩| 久久婷婷五月天| 狠狠色伊人亚洲综合网站色| 九九九九九九九九九国产精品 | 4虎在线视频| 五月婷婷五月天| 亚洲av无码国产精品字幕| 日韩图区| 精品久久久九九九孕妇| 裸体美女免费看网站青草| 久久精品国产亚洲AV高清演员表| 无码78| 精彩久久中文| 色婷婷久久综合超碰| 99综合免费视频| 91色人妻| …亚洲黄色厕厕女女在线播…| 四虎视频在线观看| 91人妻超碰| 97人人射| 亚洲精品第一| 国产欧美精选激情视频| 一级做受视频免费是看美女| 亚洲人妻日日日| 啊嗯嗯啊好大好爽| 国产久久久久影院老熟女| 920日本午夜免费| 黄色免费网页无码| 99国产在线 精品 视频| 强奸抽插av| 老鸭窝成人免费毛片视频| 综合大香蕉美。| 加勒比AV网| 日韩人妻资源网| 丁香五月性| 人妻中文字幕日韩电影| 亚洲国产婷婷在线播放| 成年人黄色小视频网站| 国内毛片婷婷六月色| 午夜男女爽爽爽影院视频| 嗯嗯不要视频| 久久久久久久唑| 蜜臀va69| 国产2.3.4区| 亚洲人综合| 久久精品国产精品| asc国产精品| 91美女国产在线| 激情小说亚洲图片| 日日噜噜夜夜久久亚洲一区二区| 老女人老91妇女老热女| 91 丝袜在线观看| 蜜臀久久精品久久久久视频| 久久九操在线观看| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 色九九九九九九| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 中国91AV| 色牛aV| 少妇被c 黄 免费观看| 亚洲天天操| 综合97| 日韩免费簧片| 9l视频自拍9l九色成人| 99re69| 啊啊啊要高潮了| 2019午夜福利视频| 色香欲影| www.伪伪| 五月丁香婷婷色| 狼天天狼天天大香蕉| 自拍丝袜美腿人妻| 九一性生活免费视频| 桑老女人九区| 亚洲国产美女久久久久| 国产一级特黄大片处女| 精品一区二区成人动漫| 强上我不卡卡| 蜜桃香蕉久草精品在线| 欧美偷拍区| 欧洲一级性爱视频在线观看| 人人色97| 男人的天堂无码| 人人妻人人爽一区二区三区| 性无码专区2020| 欧美激情另类一区二区| 丁香五月影院| 九一精品牛牛一区二区| 蜜臀99久| 精品欧美А∨无码黑人大荫蒂| 999岛国大片| 久久熟女人| 插入粉嫩少妇视频| 97超碰磁| 国产丝袜美女诱惑| 欧美97免费| 午夜亚洲国产理论秋霞| 蜜桃久久一区二区三区| 久久精品99久久久久久| 一二三区操逼国产91| 手机在线看片免费人成视频| 裸模AV女优| 在线啊啊啊| 日韩在线性爱免费视频| 97视频在线免费看| 東南亚性呦成人伦理资源在线视频| 美国精品国产精品| 人夜夜精品网站香蕉嫩草| 九九免费影片| 日韩色欲久久一二三四区| 欧美后进式| 中出人妻中文字幕91在线| 亚洲在线网站| 看黑丝美女操逼青青网站| 久久精品超碰| 中国探花熟女| 综合亚州欧美| 九九黄色视频在线观看| 麻豆a'v电影| 92性色国产午夜福利在线661| 二色av| 四虎在线免费视频| 亚洲精品三区在线观看| 亚州久久9| 亚洲色婷婷久久91| 久久久久久久少妇| 一级片视频啪啪| 国产精品 亚洲情色| 日韩精品亚洲一二三| 女人喷水视频在线观看| 91嫩草在线| 国产人妖的免费的视频| 岛国不卡超碰护士AV在线播放| 免费av在线播放二区| 一区二区三区四区五区高清无码永久视频 | 熟妇xxxxx性春色| 亚洲中文人妻色| 我想要 啊 啊 啊| 丝袜美腿欧美| 日韩中文字墓| 神马久久啊啊| 8050无码八戒| 性色亚洲| 久久偷拍人| 久久黄色视频一区二区三区| 欧美骚少妇| 综合久久欧美| 大JI巴好深好爽又大又粗视频| 美女诱惑1区2区| 久久永久无码人妻视频| 青青操在线亚洲视频观看欧美在线 | 亚洲国产天堂| julia在线观看久久| 日产操逼| 亚洲图片偷拍欧美| 五月天丁香欧洲日韩| 三级日韩一区二区三区| 青青草成人视频在线观看二区| 国产亚洲中文不卡二区| 亚洲在线A| 亚洲最大91网| 很黄很色的视频在线观看| 国产精品乱码久久久久久| 日韩性爱播放| 三级日韩一区二区三区| 九九九九一区| 啊啊啊啊二区好大| 中文字幕av乱伦| 大香蕉中文| 老女人碰碰在线碰碰视频| 欧美日韩国产中文精品字幕自在自线 | 91日韩网站| 亚洲s在线观看| 免费看黄视频亚洲网站| 9Ⅰ超碰| 国产十八禁视频| 噜噜吧,噜噜色,噜噜| 超碰在线人人射| 无毛精品| 日韩一999精品| 国产强上视频在线观看| 婷婷伊人五月| 热热色91| 亚洲天堂少妇| 91成人亚洲色图| 91色黑人少妇| 99热精品在线观看| 国产成人无码高清| 欧美经典一区二区三区| 深夜福利黄片| 久久久97| 99re视频在线播放青草| 哑洲在线| 锕锕好爽 死我在线观看| 天美国产精品| 天天插天天射| 人人考人人摸人人干| 26uuu国产亚洲综合| 神马麻豆福利院| 亚洲脚交| 大干人妻| 青青草中出视频 | 国产精品视频麻豆入口| 91社区伊人| 伊人超碰97| 精品一区二区2| 久久久成人精品| 欧亚久久偷拍视频| 亚洲黄日韩无码专区| 中文字幕啊啊啊在线观看视频| 国产自产自拍| 亚洲αv一区二区三区| 在线观看一级α片刺激高潮视频| yiqicaoav| 亚洲激情视频| 97超碰人妻| v91av| 台湾佬大香蕉| 五十路一区无码| 蜜臀久久99精品久久久久久成人小说 | 久操网在线| 求求你操操我| 亚洲色图美腿丝袜| 日韩精品大香蕉伊人在线| 人妻大相焦在线| 日韩三级在线观看mp4| 第二页中文字幕| 亚洲 图片 欧美 色图| 97se综合网| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 国产版a级片直播在线| 秋霞免费AV| 欧美日韩国内不卡| 玖玖视频在线资源一区二区三区| 久久,精品一二三| 91丝袜美女国产| 色综合美国| 天天透伊人| 国产13区| 91国产在线精品| 97在线观看视频| 亚洲毛片久久| 可以免费看黄片的视频| 国产一区二区a毛片| 亚洲精品日韩国产欧美| 999日韩中文精品观看视频。| 日韩精品三区四区| 欧美玖玖爱免费玖玖| www.久久超碰| TS人妖另类精品视频系列| 丁香六月激情| 色综合色色| 日韩97视频!在线| 另类 综合 日韩 欧美 亚洲| 九九超碰综合网| 欧美精品黑人猛交高潮| 三级AV入口| 日本3级一区二区免费| 久久一二三四五六七八九区区区| 老汉网| 精品少妇高潮久久| 国产成人无码a| 免费AV播放| 欧美 传媒 麻豆 日韩 偷拍| 亚洲高潮影院| av日韩国产一区二区| 免费精品99| 97色涩| 性色aV一区二区三区噜噜| 国产一级137片内射麻豆| 人人考人人摸人人干| 一区,二区,三区网站| 久久久草草精品| 亚洲欧美国产va在线播放频| 日本福利二区视频| 蘋果手機免費看成人Av| 97在线视频免费| 国产1769在线| 日韩78m视频| 久久久人妻| 国产在线精品偷| 久久久久久久久久久999| 熟妇色99| 99精品久久| 成人精品欧洲亚洲| 午夜国产乱伦视频| 日韩99神马视频片| 麻豆三极片| 狠狠色婷婷| 少妇熟女视频一区二区三区 | 97久久久精品| 久久精品一区二区一8| 久热91| 职场同事知名国产国产精品久久欧美日韩 | 国产黄色小视频网站| 日韩一级二级| 加勒比海人人操超碰在线| 国产偷拍自拍在线视频| 色老牛| 性久久久| 久久久久久91香蕉国产| www.亚洲成人一区| 91综合国产精品| 免费观看性欧美一级| 任我爽视频在线观看| 热热色91| 在现视频女上位好爽| 国产精品9999| 欧美第一页性| yw尤物av无码点击进入麻豆| 天天操天天射青青草| 91丝袜在线观看| 欧美中文字幕男人天堂久久精品 | 另类专区加勒比| 免费啪啪一级视频| 久操视频在线| 大香蕉伊人久久| www.91视频网| 哈哈操电影AV| 国产精品成人无码a v毛片| 美女诱惑在线一区| α√在线| AV有码在线| 丁香六月婷婷综合| 一起草三级AV电影在线观看| 四季AV综合网址| 97在线精品观看视频| 亚洲综合一| 一级A啪啪啪啪| 中文字幕三四五区| 欧美另类自拍| 性做久久久久久久| 日韩图色| 96免费视频在线| 乱伦Av网| 人人操人人肉久久精品| 情色五月天久久久| 强奸乱伦动态污图免费| 色悠久| 日韩电影天堂视频一区二区| 亚洲色欲天天人妻无码系列专区| 日本不卡一区| 欧美中字不卡| 日韩成人色图| 人人干人人操人人..com| 午夜啊啊| 青娱乐手机日韩在线视频| 欧美黄色大香蕉一区二区| 美女91| 美日韩在线不卡人妻| 去干网最新版| 777琪琪午夜免费A片| 蜜桃网熟妇| 亚洲综合在线高清| 91超级碰| 国产Aα| 校园春色五月天| 老女人老91妇女老热女| 国产超碰国产97| 国产区性爱在线视频秋霞豆| 天堂v无码免费视频| 96精品一区| 成人熟女视频一区二区三区| 色香综合天天影视综合| 91亚洲人电影| 伊人国产视频| 欧美伦乱爱| 亚洲av国产av综合av卡| 国产吹潮女在线观看| 久久岛国| 欧美aⅴ99久久黑人专区| 亚洲丝袜色| 日韩,欧美,中文在线| 91精品人妻偷情| 亚洲精品性爱片| 久久久草草精品| 久久超碰com| 久操操| 国产精品无码久久久久2025| 中文字幕黄色一起草| 校园春色中文字幕AV| 综合色图亚洲欧美| 丁香五月性| 深夜国产一区二区三区在线看| 日本色日夜干| 五月天日日操夜夜操| 久久欧洲| 91黑丝少妇| 夜夜肏2021| 极品极品色影院| 自拍视频一区在线观看| 乱操9999| 人人么人人操| 九热超碰| 熟女人妻一区二区三区| 成人资源中文字幕在线观看天天| 中文字幕后石码三区四区| 久久无码一区二区二三区性色| 精品人妻一区二区乱码一区二区| 欧美色偷拍| 91狠| 骚逼高潮久久精品| 91国产精品在线看| 盗摄 精品 另类 一区| 九九这里只有精品| 九九热在线精品视频| 欧美色五月| 国产日比| 日韩乱码Av| 精品久久久久,69国产成人精| 日本91白丝| 麻豆精品久久久久久久| 性感女人网页在线观看视频| 又大又黄国产| 夜夜高潮夜夜爽| 亚洲91亚洲| 先锋音影AV| 丝袜高跟澳门91视频| 亚洲综合色在线| 精品少妇高潮久久| 人人操人人肉久久精品| 乱伦强奸区日韩| 国产精品永久免费10000| 国产精品视频麻豆入口| 久久这里只精品99re66图| 十八禁啪啦拍视频无遮挡| 依人大香蕉| 久久久久久亚洲精品中文字幕人妻| 欧美三级一级| 91欧美性| 日本二三四区| 亚洲欧洲日本精品中文a∨| ..日韩av毛片精品久久久| 中文自拍欧美影视| ,国产乱人伦精品一区二区三区| 啊啊啊啊二区好大| 9.1小视频| 蜜臀视频网站| 八人操人人摸人人看| 久久五月视频| 欧美视频激情久久久久久| 超碰在线综合97| 在线免费观看高清无码视频| 天堂无码精品国产久| 丁香六月婷| 男人的天堂VA在线| 96久久久久久久| 高清国产性猛交xxxx乱大交| 激情看片网站| 欧美性爱一区| 日韩十八禁| 国产人妖视频一区在线观看| 亚洲AV无码天美传媒一区| 夜夜 中文视频rt| 日日爱99| 操一区| 亚洲精品蜜桃久久久久久久| 国产99999| 国产小u女在线观看| 丝袜天堂| 家庭乱伦麻豆| 天天日天天插| 9.1小视频| 国产一在线观看| www老逼91| 夜夜性| 高清在线偷拍自拍视频| 亚洲欧美精品久| 亚洲麻豆av一区二区| 色色综合网站| 日韩成人人妻网站| 波多野结衣先锋影音| 香一区二区三区| 91综合无码| 日韩乱插| AV天黑人| 亚洲国产午夜真人一级片中文字幕精品黄网站| 玖玖综合色| 一区二区乱码福利| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 51一区二区三区| 久久精品老司| 国产91av在线播放| 亚洲蜜臀懂色| 天天躁日日躁成人字幕aⅴ| 欧洲无码一区二区| 国产老太乱伦一区| 欧美色三级片91| 中国人高清www色视频免费| 2020中文字幕| 亚洲欧美综合| 久久久久久久久久久久久久9999| 免费操逼91| 男人天堂站| 国产一区二区免费福利片| 夜夜操91744565| 人人操人人舒服| 亚洲精品国产精品乱码不卡| 日韩精品国产一区二区| 欧美国产有色电影| 午夜电影在线观看无码专区| 欧美亚洲清纯| 国产成人网| 亚洲人妻久久| 东北老女人的激情视频| 亚洲AV秘 精品久久老牛影视| 亚州九九九精品视频| 日本一级二级三级网站| 97国产|免费| 欧美精品成人亚洲| 青草草免费网站av| 亚洲AV在线资源| 九月色婷婷| 国产偷拍网站| 欧美日韩国产人人| 爱我干综合| 中文字幕丰满人妻日本| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 5252色欧美在线男人的天堂| 人人爱操| 久久精品人人做人人看| 毛片麻豆91糖心精品毛情片| www.狠狠操| 欧美 精品国产制服第一页| 日韩精品作爱导航| 婷婷亚洲综合| 国产精品区在线12p| 日韩青久久| 欧美三级一级| 亚洲最大的综合性av| 91制服丝袜中文字幕| 91精品人妻一区二区三区蜜桃臀| 久久国产热视频97电影| 久久系列| 激情啪啪视频| 九久久九精品视频| 亚洲四虎熟女精品| 国模无码人体一区二区三| 精品国产乱码久久久久久日本公司| 国产乱码久久| A片 AV一级在线播放观看免费| 人妻久久一区二区三区 | 久久青青草原免费视频| 97视频播放| 97超碰在线资源网站| 激情五月天网| 中文字幕亚韩| 成人无码在线超碰网| 蜜臀99久| 日本高清一本二本免费不卡| 亚州精品丝袜-不卡成人免费| 国产动漫操逼视频| av强奸乱轮| 亚洲无 码A片在线观看麻豆| 我爱操| 久久婷婷欧美| 日本九九久久99播| 日日夜夜狠狠| wwwcaobibi| 爽极品影院| 亚州熟女乱伦| 亚洲国产熟妇综合色专区| 激情文学小说一区二区| 男人 天堂 日 亚洲| 2025亚洲男人天堂| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 一线黄色免费性爱片| 97香蕉网| 日本506070| 久热热| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区 | 国产一区二区三区久久久精品| 神马九九| 国产久久久久久| 国产精品农村妇女| 日本大香蕉综合网红本杳社区| 99精品丰满人妻无码| 无码人妻精品一区二区三区九九| 青青久操| 日韩 成人 有码| 日夜干射色啊| 天堂伊人久久| A一级色女| 天天干1区2区在线| 亚洲综合另类色图| 欧美色91| 婷婷午夜清品久久久久久久性色视频观| 伊人午夜福利视频| 超碰在线成人电影| 校园春色 亚洲| 国产成人五月天丁香花| 少妇淫妇久久久久久久| 亚洲激情视频| 精品蜜乳AV免费观看| 精品国模无码| 精品人妻中文字幕4399| 亚洲无吗在线视频| 伊人色综合网电影| Julia在线播放亚洲久久| 六六久久日韩不卡| 97欧美精品综合| 97在线无精品| 天美传媒精品久久视频| 国产一区二区在线播放| 欧美夜夜草视频| 又大又长又粗又爽又黄| 久久久国产成人一区二区三区在线| 国产热RE99久久6国产精品首| 狠狠久久亚洲欧美专区| 亚洲欧美综合色| 天天色踪合| 日韩久射综合| 亚洲天堂在线怕怕视频| 日韩性爱免费视频在线网站| 激情四射五月天| 视频在线观看一二三区| 国产乱码精品久久久久久| 搡老熟女国产1000部| 国产综合久久久麻桃个| 波多野42部激情无码喷潮| 欧美,日韩综合久久| 亚洲欧美国产日本一区二区三区| 操久久久久久| 老熟妇综合| 人人妻人人色一区二区三区| 九九热三级片| 99在线免费公开视频| 亚洲经典啪啪| 欧美精品第四五页中文字幕在线观看| 国产1727欧美| 日韩在线国产字幕| 黄片aaaaa一区| 俺去久久| 欧美后入式| 中文字幕高清精品一区| 亚洲日本韩国在线| 丰满少妇高潮无码| 久久久久久九九九九九| 99re公开精品免费视频| 97超碰色五月| 欧美三四五区| 久久东京伊人一本到鬼色| 丁香五月影院| 91色色综合| 插入逼91| 五月天激情小说| 亚州中文字幕超碰97| 97超碰色色| 无码伊人久久大杳蕉中文无码| 亚洲91亚洲| 久久久久久久9| 国产av美女被艹的乱叫| 1区2区3区中文字幕日韩| 91爱网| 国产一区二区视频在线播放| 怡红院成人av| 国产无码久久高清| 日日夜夜干| 五月天AV资源| 日韩探花精品在线视频| 十八禁黄色成人网站观看| 97干色| 五月丁香啪啪啪| 欧美黑人日韩少妇色情| 国产高清26uuu| 上床不卡网站| 亚洲āv网址在线观看| 七久久久| 亚洲风情在线观看| 婷婷99狠狠躁天天躁| 亚洲好色人妻| 91干熟女| 性生活性生大爱77AV国产| 久久精品国产亚洲AV高级北京| 熟女欧美日韩综合婷婷| 中文字幕第9页萱萱影音先锋| 粉嫩国产精品久久粉嫩| 色妇综合网| 日日狠狠久久偷偷色综合免费| 精品在线78| 中文字幕成人| 精品无码少妇| 久久人妻丝袜一区二区三| 十八禁黄色| 大香蕉免费中文| 狠狠干91| 亚洲AO在线| 亚洲另类欧美精品| 1二区9| 性在久久久久久| 91国产丝袜美女| 免费精品福利在线观看| 亚洲少妇视频| 超碰亚洲欧美日韩无| 日韩欧美亚欧在线视频| 亚州再线| 偷拍自拍在线视频观看| KK色在线影院| 国产熟女少妇一区| 国产成人超碰在线| 裸体美女久久久| 亚洲成人福利电影免费| 91亚洲黄色网| 男人的天堂2010| 欧美特大AA级黄片| 后入式视频国产自| 久久怡红院| 超碰精品国产无码| 久久精品99久久久久久| 久热婷婷| 秋霞一集毛片观看| 久久人体一区二区| 色老汉玖玖爱| 亚洲密乳AV| 国产丝袜高跟美女av免费观看| 五月丁香六月婷| 男女无套 免费网站| 夜夜综合| 东京热亚洲一区二区| 91AV入口| 久99在线免费观看视频| 中文字幕视频2区| 日韩国产成人自拍视频| 熟妇色99| av东京热男人的天堂| 91超级碰碰碰| 搞中出久久| 精品天堂| 亚洲熟女乱色一区二区三区久久久| 丁香六月婷婷| 国产日韩在线播放av| 国产精品久久久亚洲第一牛牛_在线观看 | 亚洲污污网站| 啊啊啊操一区| 日韩欧美中文| 精品国产av一区二区三区四区入口| 99热国产| 欧美狠狠弄| 91操碰| 欧美日韩在线国产在线| 超清中文乱码字幕| 欧美激情一| 白丝AV网站| 五月天精品| 日韩欧美中文日韩欧美色| 97操| 国产精品丝袜在线| 97丝袜亚洲在线播放| 日本三级小说中文字幕| 激情五月天色色网| 亚洲国产成人精品久久久国产成人一区二区三.| 亚洲丝袜少妇在线| 日本97久久| 久久日本熟女精品一区| 亚洲国产综合久久久性感熟妇| 97啪啪| 69精品久久久久中文字幕| 亚洲无线码欧洲精品区别| 日韩欧美加勒比| 亚洲图片欧美偷拍| 欧美最婬乱婬爆婬牲视频| 强奸熟女一区二区三区| 国产高清不卡视频| 800zy一区二区| 校园春色 男人天堂| 久久色情| 亚洲精品亚洲人成人网| 久久无码电影| 日韩一性一交一A片俄罗斯| 国产丝袜美女在线一区| 97在线视频免费观看| 青草地一本线一区二区三区| 啊啊啊 在线| 色69大色97香蕉| 蜜桃狠狠色伊人亚洲综合 | 午夜激情成人在线观看| 91色人妻| 少妇厨房愉情理伦片bd在线观看| 亚洲天堂精品日韩电影| 69天堂| 欧美天天| 久久成年片色大黄全免费网站| 亚洲全色网| 亚洲加勒比| 国产福利精品98视频| 国产综合色精品在线观看| 91精品人| 超碰97人妻免费在线| 18禁止看精品中文字幕| 日韩熟女操逼| 操逼片国产| 操逼视频亚洲| 亚洲日本韩国在线| 五月激情综合网| 精品一区二区三区蜜桃臀赵总 | 亚洲av影院在线观看| 国产亚州高清国产拍精| 中文自拍欧美影视| 激情五月天网站| 殴美牲| 久操 高清| 少妇第一页| 青娱乐 青青青操 日逼| 99999国产精品| 日本精品一级二级三级| 欧美亚洲一级在线观看| 日韩少妇一区二区三区| 激情五月天婷婷| 国产精品经典一卡久久久| 麻豆一区二区三区精品| 久久噜噜噜精品国产亚洲综合| 日本精品加勒比海一区| 天天噜| Av手机版天堂网| 国产精品免费视频人成| 男人天堂久久精品| 夜夜国产一区| 久久亚洲日韩国产欧| 国产精品美女| www.av在线视频| 丁香五月天视频| 亚洲永久AV无码精品秋霞| 日韩电影免费网站麻豆视频| 97超碰超碰| 欧美亚洲尤物久久| 天天干美少妇一区| 九九自拍伦理| 欧美懂色综合网| 久久夜黄色无码A级大片| 99色热| 色综合20p| 偷拍 亚洲 欧美| 奇米狠999| 小草三级久久观看| 高清孕妇孕交 交孕妇| 日韩免费a级毛片无码a∨| 中日韩欧美精品无码AⅤ一区二区| 男人天堂一区二区| 青青草久草AV| 另类图片欧美激情综合| 精品性爱无码在线播放| 夜夜狼人妻| 啪啪啪综合| 欧美亚洲另类在线蜜桃| 欧美专利1区2区3区4区5区免费| 在线免费试看60秒| 日本人妻丰满熟妇久久久久久| 国产精品免费视频人成| 精品网站9999| 日韩三级av片| 婷婷影院入口| 一区二区 电影 亚洲| 欧美色图亚洲激情| 91free福利| 龙兴卡官方查询| 亚洲āv网址在线观看| 99热66| 一二三卡欧美日韩人妻免费精品| 欧美五十路熟| 男人下部插入女人下部 | 啪啪资源网| 美女97超碰| 啪啪综合网| 五月丁香啪| 在线播放欧洲免费av| 中文字幕精品日韩中文字幕| 亚洲色性情三级| 日韩精品在线视频,日韩精品……| 大香蕉综合在线| 941超碰| 成人美女av| 91色色综合| 国产东北女人在线视频| 超碰99热中文字幕| 欧州一区二区三区四区| www老逼91| 亚洲无码电影久久久| 91亚洲黑人| 91精品91久久久中77777| 狠狠色色| 一二三区精品视频| 丁香五月天视频| 天天亚洲| 亚洲色偷偷色噜噜狠狠99网| 人妻少妇精品视频一区二区三区| 人人色人人操在线| 欧美91网| 色九月婷婷| 98久久| 区一在线观看| 亚洲性爱成人| 美女AV一区二区| 国产探花精品在线| 性性久久| 一级特级aaaa毛片免费观看 | 熟妇人妻精品一区二区| 婷婷九月色| 九九九九九精品视频| 五月丁香六月| 曰韩中文人妻视频| 激情图片伦理国产一区二区日韩| 肏逼视频日本| 97超碰热线| 东北丰满熟女国产一区| 久男人久久| 久久XX| 国产精品人妻无码久久久互動交流 | 久久精品高清无码一区| 亚洲AV无码国产精品久久久久| 91久久精品美女高潮喷水| 婷婷五月天激情四射| 超碰九7免费| 佐山爱中文字幕| 国产性爱在线视频一区二区| 久久视频少妇美女| 五月丁香影视| 秋霞一级鲁丝片A片| 中国熟女网站| 99视频只有精品| 成人av毛片在线观看| 日日干夜夜欢| 亚洲综合色网| 亚洲高清无毛一区二区| 亚洲图片在线| 亚洲无套久久嗯嗯| 眼镜人妻101.com| 亚洲中字慕不卡| 国产丝袜美女诱惑| 太久视频| 亚洲图片另类| 午夜综合在线| 99中出在线| 色久桃花影院在线观看| 亚洲国产综合图区中文字幕| 亚州高清色综合| 黑丝少妇在线观看| 国产毛片久久久久久久| 无套后入双马尾| 97色论| 婷婷激情五月综合| 日韩性爱人人爱人人操| 中文字幕AV中出| 久久日本熟女精品一区| 免费精品99| 操逼操逼逼操操逼91| 曰韩中文人妻视频| 精品免费成人久久| 屌妞视频久久久久久久久久久久| 巨爆乳肉感一区二区三区竹菊影视| 91网九色蝌蚪操熟女| 欧美性色欧美| 亚洲综合69| 操香逼| 天堂蜜桃无码视频一区二区| 多乙久久久久久| 国产AAAAAABBBBB|