精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

軟件開發(fā)探索之道:讓自己成為知識的所有者

開發(fā) 前端
本文我們通過一個 Rust 的例子來探討這個方法。當(dāng)這個方法本身跟 Rust 無關(guān)。我們在學(xué)習(xí)編程語言,使用第三方庫,構(gòu)建復(fù)雜的系統(tǒng),都可以用這個方法。

 [[422065]]

在做軟件開發(fā)的時候,總會有一些奇奇怪怪的問題難以解答:

  • 棧是向上增長還是向下增長?(這其實是個不嚴(yán)謹(jǐn)?shù)膯栴})
  • arm 是 little endian 還是 big endian?
  • 閉包究竟是一個什么樣的數(shù)據(jù)結(jié)構(gòu)?它占用多少內(nèi)存?
  • ...

這些讓人摸不著頭腦的問題,只要你耐心查找,在 stackoverflow 或者各種論壇上,一般能夠找到答案。不過,別人給出來的答案很可能是模棱兩可的,不好理解的,甚至是錯誤的。我們需要花時間甄別那些正確的、并且精準(zhǔn)的答案,還需要花時間閱讀這些答案。有時候,即便是你得到了答案甚至記住了答案,你可能還是沒有完全理解別人給出的答案。當(dāng)你需要把這樣的答案講給別人時,你會發(fā)現(xiàn)自己似乎無法講得清楚。

在我的職業(yè)生涯中,遇見過很多所謂的「高手」,漫長的職業(yè)生涯讓他們遇見了各種奇葩的問題,通過各種知識搜索和整理的手段,他們也記住了這些問題的答案。他們經(jīng)常能拋出一些冷門的知識,知識儲備之豐富讓我嘆為觀止。但當(dāng)我想深入下去時,就發(fā)現(xiàn)他們對事物的理解不過是一個指向別處的引用(reference),是借來(borrow)的知識,自己沒有知識的所有權(quán)(ownership),所以往往容易語焉不詳,只能給出淺層的回答。

那么,如何避免這種情況,讓自己成為知識的所有者呢?

我們要學(xué)會不依賴別人的斷言,單單通過代碼本身來探索問題的答案。作為開發(fā)者,我們最大的優(yōu)勢就是我們研究的對象,計算機和計算機軟件,就放在離我們唾手可得的地方。我們只要想辦法用代碼構(gòu)造研究這個問題的實驗,就能不斷迭代夠逐漸找到答案。而且,這答案是第一手的,不是別人咀嚼后喂給你的,而是你通過實驗驗證出來的,所以它是你自己的知識,即便過了十年二十年,你依然能清晰地給出答案,或者至少給出通往這個答案的途徑。

問有意思的問題

最近在我的極客時間的專欄《陳天 · Rust 第一課》中,有個同學(xué)在看到我畫的這張圖時:

 

 

問了這樣一個問題:

虛表是每個類有一份,還是每個對象有一份,還是每個胖指針有一份?

這是一個非常棒的問題。我不知道有多少人在學(xué)習(xí)的時候會發(fā)出這樣的疑問,但我猜很少,因為至少我之前在直播講 Rust 時,在我公司內(nèi)部講 Rust 時,沒有人關(guān)心過這個問題。

而 問對問題,比知道答案更重要 。一個好的問題,就已經(jīng)離知識很近了。

<愛因斯坦>

如何才能問出有意思的問題?

我在學(xué)習(xí) trait object 的時候,也問過同樣的問題,并且順著問題,找到了答案。你想想,什么樣的思考會觸發(fā)問這個問題呢?

也許來自對比學(xué)習(xí)(我自己的情況):因為 C++ 每個類有一個自己的虛表,所以不免會好奇 trait object 是不是也是類似的實現(xiàn)?

也許來自對內(nèi)存效率的擔(dān)憂:trait object 有個指針指向虛表,那么如果在每個 trait object 生成時都生成一張?zhí)摫恚敲春芾速M內(nèi)存啊。對于上面的 Write trait,還好,只有幾個方法,但對一些比較大的 trait,如 Iterator,有近七十個方法,也就是說光這些方法組成的虛表,就有五百多字節(jié)!如果每個 trait object 都自己生成這樣一張表,內(nèi)存占用多可怕!所以如果不搞明白,不敢大量使用啊。

也許還有其它什么思考觸發(fā)了這個問題。

不管怎么樣,能問出好的問題,一定會現(xiàn)有一些先驗知識,然后通過細(xì)致的觀察,深入的思考,才會慢慢萌發(fā)問題。

從假設(shè)到通過實驗驗證假設(shè)

那么,有了好問題,我們?nèi)绾谓獯疬@個問題呢?

我們可以根據(jù)自己已有的知識,思考最可能接近真相的方向,然后動手做實驗來驗證自己的假設(shè)。對于這個問題,我認(rèn)為為每個 trait object 生成一張表效率太低,不太可能,所以傾向于像 C++ 那樣,每個類型都有靜態(tài)的虛表。既然我有了這樣的假設(shè),那么怎么驗證它呢?我可以用兩個字符串分別生成 trait object,然后打印虛表的地址進行對比。如果一致,那么符合我的假設(shè):每個類型都有靜態(tài)的虛表。

實驗一

有了這個方向,查閱資料,寫出下面的第一個實驗的代碼并非難事:

  1. use std::fmt::Debug; 
  2. use std::mem::transmute; 
  3.  
  4. fn main() { 
  5.     let s1 = String::from("hello"); 
  6.     let s2 = String::from("goodbye"); 
  7.     let w1: &dyn Debug = &s1; 
  8.     let w2: &dyn Debug = &s2; 
  9.  
  10.     // 強行把 triat object 轉(zhuǎn)換成兩個地址 (usize, usize) 
  11.     // 這是不安全的,所以是 unsafe 
  12.     let (addr1, vtable1) = unsafe { transmute::<_, (usize, usize)>(w1 as *const dyn Debug) }; 
  13.     let (addr2, vtable2) = unsafe { transmute::<_, (usize, usize)>(w2 as *const dyn Debug) }; 
  14.      
  15.     // trait object(s / Display) 的 ptr 地址和 vtable 地址 
  16.     println!("addr1: 0x{:x}, vtable1: 0x{:x}", addr1, vtable1); 
  17.     // trait object(s / Debug) 的 ptr 地址和 vtable 地址 
  18.     println!("addr2: 0x{:x}, vtable2: 0x{:x}", addr2, vtable2); 
  19.  
  20.     // String 類型擁有相同的 vtable? 
  21.     assert_eq!(vtable1, vtable2); 

如果你在 rust playground 里運行,會得到下面的結(jié)果:

addr1: 0x7ffd1c524910, vtable1: 0x556591eae4c8
addr2: 0x7ffd1c524928, vtable2: 0x556591eae4c8

從實驗一中,我們得出結(jié)論: 虛表是共享的,不是每一個 trait object 都有一張?zhí)摫?/b> 。從虛表的地址上看,它既不是堆地址,也不是棧地址。目測像是代碼段或者數(shù)據(jù)段的地址?

你看,我們通過觀測實驗結(jié)果,又有了新的發(fā)現(xiàn),同時有了新的問題。

于是我們繼續(xù)迭代。

實驗二

在實驗一的基礎(chǔ)上,我們可以定義一個靜態(tài)變量 V,打印一下它的地址(DATA 段),以及打印一下 main() 函數(shù)的地址(TEXT 段)來比較:

  1. static V: i32 = 0
  2. println!("V: {:p}, main(): {:p}", &V, main as *const ()); 

打印結(jié)果(注意每次編譯后運行地址都會不同):

  1. addr1: 0x7fff2dd3e7f8, vtable1: 0x557a21b9e488 
  2. addr2: 0x7fff2dd3e810, vtable2: 0x557a21b9e488 
  3. V: 0x557a21b910ec, main(): 0x557a21b63e40 

Bingo!實驗二證明了我們的猜測沒錯, 虛表是編譯時就生成好,塞入二進制文件中的 。當(dāng)生成 trait object 時,根據(jù)是哪個類型,再指向?qū)?yīng)的位置。

那么,Rust 為每個類型(比如 String )編譯時只生成一個 vtable,對么?

我們目前很接近真相,但還有未解的疑問。從目前的實驗中,我們還無法得出這個結(jié)論。實驗一里,我們只用了 Debug trait,這個樣本太小,不具備普遍性。如果對同一個數(shù)據(jù)類型(比如 String)使用不同的 trait,會導(dǎo)致不同的結(jié)果么?我們并不知道。如果結(jié)果相同,那么我們就大概率可以確定,一個類型一張?zhí)摫恚駝t,就應(yīng)該是每個類型的每個 trait 實現(xiàn),都有一張?zhí)摫怼?/p>

實驗三

于是在實驗三里,我們用同一個類型的兩個不同的 Trait,來生成不同的 trait object,看看其虛表是否是同一個地址:

  1. use std::fmt::{Debug, Display}; 
  2. use std::mem::transmute; 
  3.  
  4.  
  5. fn main() { 
  6.     let s1 = String::from("hello world!"); 
  7.     let s2 = String::from("goodbye world!"); 
  8.     // Display / Debug trait object for s 
  9.     let w1: &dyn Display = &s1; 
  10.     let w2: &dyn Debug = &s1; 
  11.  
  12.  
  13.     // Display / Debug trait object for s1 
  14.     let w3: &dyn Display = &s2; 
  15.     let w4: &dyn Debug = &s2; 
  16.  
  17.  
  18.     // 強行把 triat object 轉(zhuǎn)換成兩個地址 (usize, usize) 
  19.     // 這是不安全的,所以是 unsafe 
  20.     let (addr1, vtable1) = unsafe { transmute::<_, (usize, usize)>(w1 as *const dyn Display) }; 
  21.     let (addr2, vtable2) = unsafe { transmute::<_, (usize, usize)>(w2 as *const dyn Debug) }; 
  22.     let (addr3, vtable3) = unsafe { transmute::<_, (usize, usize)>(w3 as *const dyn Display) }; 
  23.     let (addr4, vtable4) = unsafe { transmute::<_, (usize, usize)>(w4 as *const dyn Debug) }; 
  24.  
  25.  
  26.     // s 和 s1 在棧上的地址,以及 main 在 TEXT 段的地址 
  27.     println!( 
  28.         "s1: {:p}, s2: {:p}, main(): {:p}"
  29.         &s1, &s2, main as *const () 
  30.     ); 
  31.     // trait object(s / Display) 的 ptr 地址和 vtable 地址 
  32.     println!("addr1: 0x{:x}, vtable1: 0x{:x}", addr1, vtable1); 
  33.     // trait object(s / Debug) 的 ptr 地址和 vtable 地址 
  34.     println!("addr2: 0x{:x}, vtable2: 0x{:x}", addr2, vtable2); 
  35.  
  36.  
  37.     // trait object(s1 / Display) 的 ptr 地址和 vtable 地址 
  38.     println!("addr3: 0x{:x}, vtable3: 0x{:x}", addr3, vtable3); 
  39.  
  40.  
  41.     // trait object(s1 / Display) 的 ptr 地址和 vtable 地址 
  42.     println!("addr4: 0x{:x}, vtable4: 0x{:x}", addr4, vtable4); 
  43.  
  44.  
  45.     // 指向同一個數(shù)據(jù)的 trait object 其 ptr 地址相同 
  46.     assert_eq!(addr1, addr2); 
  47.     assert_eq!(addr3, addr4); 
  48.  
  49.  
  50.     // 指向同一種類型的同一個 trait 的 vtable 地址相同 
  51.     // 這里都是 String + Display 
  52.     assert_eq!(vtable1, vtable3); 
  53.     // 這里都是 String + Debug 
  54.     assert_eq!(vtable2, vtable4); 

結(jié)果令人驚喜:String + Display 生成的 trait object,和 String + Debug 生成的 trait object,使用的是不同的 vtable:

  1. s1: 0x7ffc7d427a08, s2: 0x7ffc7d427a20, main(): 0x561b76ff2e90 
  2. addr1: 0x7ffc7d427a08, vtable1: 0x561b7702d3b8 
  3. addr2: 0x7ffc7d427a08, vtable2: 0x561b7702d3d8 
  4. addr3: 0x7ffc7d427a20, vtable3: 0x561b7702d3b8 
  5. addr4: 0x7ffc7d427a20, vtable4: 0x561b7702d3d8 

所以,我們可以確定, 虛表是每個 (Trait, Type) 一份,在編譯時就生成好了 。

那么,編譯器在什么時機來生成這張?zhí)摫砟兀坑欣碛赏茢啵诰幾g器編譯 impl 某個 trait 的代碼時生成了虛表,比如:

  1. impl Debug for String {...} 

因為此時編譯器有生成虛表所需要的一切信息:

  • 數(shù)據(jù)如何銷毀:String 的 drop 方法的地址此時需要已經(jīng)編譯得出
  • 數(shù)據(jù)的大小和對齊:此刻是 String 類型,所以大小 24 字節(jié),對齊 8 字節(jié)
  • trait 方法:在編譯 impl Debug 時就已經(jīng)得到 fmt() 方法的地址

如果我是編譯器的開發(fā)者,此時不做,更待何時?所以我們可以做出這個推斷。這個推斷邏輯自洽,看上去非常合理,大概率是對的。不過要驗證起來不那么容易,除非我們繼續(xù)在 Rust 編譯器源碼中做實驗。

從實驗結(jié)果中最終得出結(jié)論

好,綜合上述三個實驗,我們的腦海中,已經(jīng)可以構(gòu)筑出這樣一幅圖:

 

 

此刻,我們就完美地找到了一開始的問題我們想要的答案。對于開頭的問題,我是這么回答的:

好問題。這個在講 trait 的那一課有講到。虛表在每個 impl TraitA for TypeB {} 實現(xiàn)時就會編譯出一份。比如 String 的 Debug 實現(xiàn), String 的 Display 實現(xiàn)各有一份虛表,它們在編譯時就生成并放在了二進制文件中(大概是 RODATA 段中)。 所以虛表是每個 (Trait, Type) 一份。并且在編譯時就生成好了。 如果你感興趣,可以在 playground 里運行這段代碼(這是后面講 trait 時使用的代碼): https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=89311eb50772982723a39b23874b20d6 。限于篇幅,代碼就不貼了。

因為我自己通過做實驗,找到了答案,所以,我對自己的結(jié)論和推斷都很有信心。同時,因為這是我自己探索出來的知識,我并非借用別人腦海中的想法,而是對它擁有所有權(quán),所以,我可以自如地從各個角度來構(gòu)筑我的答案。

小結(jié)

在韋氏詞典中,是這么定義科學(xué)方法的:科學(xué)方法是一種有系統(tǒng)地尋求知識的程序,涉及了以下三個步驟:問題的認(rèn)知與表述、實驗數(shù)據(jù)的收集、假說的構(gòu)成與測試。我們在探索 Rust 的 vtable 是如何構(gòu)建的過程中,使用了科學(xué)方法。它是一個不斷迭代的過程,從觀測開始,一路經(jīng)歷問問題,做出假設(shè),構(gòu)建實驗來驗證假設(shè),觀察實驗結(jié)果,提出新的問題,進一步迭代下去,直到我們形成了一個自洽的理論:

 

 

本文我們通過一個 Rust 的例子來探討這個方法。當(dāng)這個方法本身跟 Rust 無關(guān)。我們在學(xué)習(xí)編程語言,使用第三方庫,構(gòu)建復(fù)雜的系統(tǒng),都可以用這個方法。如果你能夠掌握和使用這個方法,那么,慢慢地你就能成為知識的所有者。

 

責(zé)任編輯:張燕妮 來源: 迷思
相關(guān)推薦

2011-06-08 00:09:30

RationalInnovate 20軟件開發(fā)

2009-08-19 09:40:57

軟件方法論

2009-06-23 09:39:22

2013-05-15 10:02:08

軟件開發(fā)開發(fā)者

2011-09-04 15:16:45

Innovate 20Rational云計算

2009-02-13 10:00:41

面試軟件開發(fā)程序員

2024-09-23 15:02:40

2019-11-22 08:00:00

軟件軟件開發(fā)

2010-11-08 09:36:23

移動軟件開發(fā)者

2014-12-09 15:51:31

Android LAPI

2012-04-27 10:36:02

OracleJava谷歌

2020-03-20 11:43:20

開發(fā)編程語言技術(shù)

2023-10-16 08:00:00

2022-05-31 17:36:25

技術(shù)面試編程

2022-09-07 11:56:53

汽車軟件

2015-05-19 09:11:32

OpenStackOpenStack貢獻

2020-02-28 15:14:41

Docker大數(shù)據(jù)軟件開發(fā)

2016-12-14 14:09:56

華為軟件DevOps

2024-03-26 10:00:00

NVIDIA開發(fā)工具Omniverse

2009-02-10 17:11:53

SaaSSaaS開發(fā)PaaS
點贊
收藏

51CTO技術(shù)棧公眾號

精品黑人一区二区三区观看时间| 欧洲精品在线播放| 中文字幕欧美色图| 91精品一区二区三区综合在线爱| 91麻豆精品91久久久久同性| a级片一区二区| 免费国产在线观看| 国产在线精品免费av| 国模gogo一区二区大胆私拍| avtt香蕉久久| 欧美一级网址| 精品国产999| 性刺激综合网| 国产刺激高潮av| 欧美96一区二区免费视频| 欧美www在线| 亚洲人成人无码网www国产 | 欧美久久精品一级c片| 欧美美女直播网站| 国产免费黄色一级片| 亚洲视频一二三四| 超碰在线观看免费| 91在线一区二区| 91久久精品日日躁夜夜躁国产| 国产乡下妇女做爰视频| 久久亚洲国产| 精品调教chinesegay| 色婷婷综合在线观看| 欧美性理论片在线观看片免费| 一区二区三区欧美| 日韩国产精品一区二区三区| 色网站免费观看| 国产毛片一区二区| 国产人妖伪娘一区91| 欧美h在线观看| 亚洲高清成人| 精品少妇一区二区30p| 蜜桃av免费在线观看| 同性恋视频一区| 日韩精品一区二区三区中文不卡 | 青青草原综合久久大伊人精品优势| 欧美成人免费小视频| jizz18女人高潮| 午夜a一级毛片亚洲欧洲| 日韩精品中文字幕在线一区| 在线视频一二区| 成人在线免费电影网站| 欧美性少妇18aaaa视频| 人人妻人人添人人爽欧美一区| 18视频在线观看| 亚洲日本在线天堂| 日韩第一页在线观看| 1024国产在线| 中文字幕二三区不卡| 日韩欧美手机在线| 国产午夜精品一区理论片| 久久人人97超碰com| 久久精品二区| 欧美成人片在线| 久久久久国产精品厨房| 欧美日韩在线不卡一区| 男生女生差差差的视频在线观看| 91丨porny丨首页| 久久99影院| 免费在线性爱视频| 国产日韩欧美a| 日韩尤物视频| 日韩专区在线| 一区二区三区国产精品| 91成人综合网| 成人在线黄色电影| 色哟哟国产精品| 999精品视频在线| 日韩毛片免费看| 欧美一区二区三区电影| 成人一区二区三区仙踪林| 国产精品视频3p| 精品亚洲一区二区| 欧美黄色激情视频| 国产精品成人一区二区不卡| 欧美www在线| 国产精品18p| 鲁大师成人一区二区三区| 国产精品免费福利| 国产激情视频在线播放| 97精品电影院| 一本一道久久a久久精品综合 | 97国产精品视频| 草久久免费视频| 美腿丝袜亚洲三区| 97视频资源在线观看| 人妻一区二区三区四区| 欧美国产成人精品| 国产高清不卡无码视频| 黑人巨大亚洲一区二区久 | 亚洲精品97久久中文字幕| 91一区二区在线| 亚洲最新在线| 国产高清视频色在线www| 在线观看精品一区| 制服.丝袜.亚洲.中文.综合懂| 亚洲成人一品| 九九精品视频在线| 国产真人无遮挡作爱免费视频| 国内不卡的二区三区中文字幕| 国产一区二区免费在线观看| www.亚洲.com| 婷婷国产v国产偷v亚洲高清| 日本特黄a级片| 欧美亚视频在线中文字幕免费| 色偷偷88888欧美精品久久久| 国产免费一区二区三区四区| 丝袜a∨在线一区二区三区不卡| 成人av免费看| 日本中文在线观看| 欧美视频免费在线观看| 性高潮久久久久久| 日韩一区亚洲二区| 日本久久91av| 人妻一区二区三区免费| 亚洲欧美日韩在线不卡| 欧美性猛交xxx乱久交| 国产在线播放精品| 欧美国产日本高清在线 | 免费亚洲电影| 精品国产91九色蝌蚪| 天堂网avav| 青青草91视频| 日韩国产欧美一区| 一级毛片久久久| 亚洲精品在线网站| 日本一级二级视频| 精品综合免费视频观看| 日韩精品国内| 欧美电影网址| 亚洲美女视频网站| 日产精品久久久久| 成人激情免费电影网址| 毛片在线视频观看| 北岛玲精品视频在线观看| 正在播放欧美视频| 精品人妻一区二区三区潮喷在线| zzijzzij亚洲日本少妇熟睡| 丁香色欲久久久久久综合网| 经典三级久久| 美女啪啪无遮挡免费久久网站| 国产又色又爽又黄又免费| 国产精品美女久久久久久久网站| 国产免费人做人爱午夜视频| 亚洲精品动态| 欧美一区在线直播| 你懂的视频在线免费| 欧美性xxxxxx| 欧美老女人性生活视频| 免费高清在线一区| 在线视频欧美一区| 日本中文字幕视频一区| 久久午夜a级毛片| а√天堂资源在线| 亚洲大片在线观看| 亚洲国产精品自拍视频| 免费日韩视频| 日韩一区二区三区资源| 久久爱.com| 久久国产精彩视频| 乱精品一区字幕二区| 午夜电影网亚洲视频| www.久久av| 日本va欧美va精品| 亚洲欧美日韩不卡| 国产欧美自拍一区| 国产成人精品优优av| 色影院视频在线| 欧美一区二区成人| 欧美一区二区激情视频| 国产亚洲精品精华液| 日韩一区二区三区久久| 综合久久一区| 久久久婷婷一区二区三区不卡| 韩国精品主播一区二区在线观看| 日韩视频在线免费| 蜜桃视频污在线观看| 日韩欧美中文在线| 波多野结衣久久久久| 成人午夜私人影院| 丁香婷婷激情网| 在线观看国产精品入口| 九色91国产| 午夜精品久久久久久毛片| 欧美激情一区二区三区久久久| 欧洲视频在线免费观看| 51精品视频一区二区三区| 日韩免费一级片| 成人欧美一区二区三区黑人麻豆| 亚洲欧美高清在线| 奇米777欧美一区二区| 日本一级黄视频| 精品久久影视| 国产乱码精品一区二区三区日韩精品 | 91极品身材尤物theporn| 特黄一区二区三区| 成人晚上爱看视频| 婷婷免费在线观看| 国产精品久久久免费| 免费观看黄色的网站| 天天久久夜夜| 懂色中文一区二区三区在线视频| 亚洲伦理影院| 国语自产精品视频在线看一大j8| 最新电影电视剧在线观看免费观看| 亚洲精品一区二区三区四区高清| 一级片在线免费观看视频| 精品久久中文字幕| 久艹视频在线观看| 国产精品二三区| 亚洲第一香蕉网| 国产ts人妖一区二区| 孩娇小videos精品| 免费在线欧美黄色| 精品丰满人妻无套内射| 自拍偷拍欧美专区| 亚洲永久一区二区三区在线| 九九在线精品| 精品国产aⅴ麻豆| 96sao在线精品免费视频| 91精品久久久久久久久| 日韩精品专区| 欧美在线免费视频| 55av亚洲| 91精品国产91久久| 日本片在线看| 欧美猛少妇色xxxxx| 免费av在线| 日韩一区在线视频| 99中文字幕一区| 国产亚洲人成网站在线观看| 男生女生差差差的视频在线观看| 亚洲国产精久久久久久| 色屁屁草草影院ccyycom| 精品久久久久久久人人人人传媒| 国产伦理吴梦梦伦理| 欧美喷水一区二区| 国产又粗又黄又爽| 欧美精品欧美精品系列| 一级做a爱片久久毛片| 欧美日韩精品免费| 在线免费观看高清视频| 欧美日韩精品高清| 国产乱码久久久| 日韩亚洲电影在线| 北条麻妃一二三区| 亚洲精品一区二区三区99| 日本人妻丰满熟妇久久久久久| 亚洲成人久久久久| 欧洲成人一区二区三区| 亚洲福利在线播放| 日韩a在线观看| 亚洲性夜色噜噜噜7777| 国产高清视频在线观看| 中文字幕亚洲综合久久| 无遮挡动作视频在线观看免费入口 | 国产精品偷伦一区二区 | 欧美综合二区| 久久久久久久片| 蓝色福利精品导航| 最好看的中文字幕| 99热精品一区二区| 欧美成人国产精品一区二区| 国产精品久久久久影院老司 | 亚洲天堂一区二区三区四区| 水蜜桃在线免费观看| 亚洲国产免费看| 国产第一页视频| 久色婷婷小香蕉久久| aaaaa黄色片| 91视视频在线观看入口直接观看www | 一级黄色片在线免费观看| 国产成人在线视频网站| 国产精品久久久久久亚洲色| 久久精品一区二区三区不卡牛牛| 国产视频123区| 一区二区三区精品视频在线| 天天操天天摸天天干| 欧美精三区欧美精三区| 亚洲国产精品久久久久久久| 亚洲美女黄色片| www久久日com| 清纯唯美日韩制服另类| 亚洲精品aa| 久久久久久草| 99久久视频| 国产一区二区三区精彩视频 | 亚洲五月婷婷| 亚洲性生活网站| 处破女av一区二区| 国产午夜福利一区| 亚洲国产成人av好男人在线观看| 久久亚洲精品石原莉奈 | 国产精品视频一区二区久久| 久久97久久97精品免视看| 欧美黑人一区| 国产精品久久精品国产| 色婷婷色综合| 久久久免费视频网站| 国产91高潮流白浆在线麻豆| 先锋影音av在线| 天天免费综合色| www.xxx国产| 丝袜美腿精品国产二区| 在线天堂资源| 99国产高清| 99精品视频在线| 欧美激情精品久久久久久小说| 丁香婷婷综合网| 欧美a级片免费看| 日本精品视频一区二区| 五月天激情婷婷| 久久久久久尹人网香蕉| 国产一区二区视频在线看 | 国内自拍一区| 国产精品自在自线| 国产日产欧美一区二区视频| 国产一级特黄aaa大片| 欧美一区二区三区四区高清| 天天综合视频在线观看| 国产精品电影一区| 亚洲综合图色| www国产黄色| 成a人片国产精品| 国产亚洲小视频| 日韩欧美中文字幕制服| 国产不卡在线| 成人女保姆的销魂服务| 欧美韩日高清| 思思久久精品视频| 中文字幕日韩一区二区| 一二三四区视频| 日韩视频欧美视频| 99精品女人在线观看免费视频 | 国产模特精品视频久久久久| 无码人妻精品一区二区三区99不卡| 亚洲美女屁股眼交| 99热这里是精品| 欧美日韩国产123| av男人一区| 2018国产在线| 91视频观看免费| 日韩在线播放中文字幕| 亚洲片在线观看| 韩国成人在线| 中文字幕中文字幕在线中心一区| 精彩视频一区二区| 日日骚一区二区三区| 日韩美一区二区三区| 91破解版在线观看| 欧美精品尤物在线| 日本在线观看不卡视频| 国产精品麻豆免费版现看视频| 欧美日韩久久一区| 中中文字幕av在线| 国产精品三区www17con| 香蕉亚洲视频| 99久久99久久精品免费| 日韩一区二区免费电影| 丁香花在线影院| 欧美日韩一区二区视频在线| 美国毛片一区二区三区| 中文字幕另类日韩欧美亚洲嫩草| 日韩女优av电影在线观看| 美女视频在线免费| 日韩精品久久一区| 国产一区免费电影| 日韩av一二三区| 在线成人激情视频| 另类视频一区二区三区| 欧美亚洲精品一区二区| 中文欧美字幕免费| 国产成人精品a视频| 国产91精品视频在线观看| 成人看的视频| 中文字幕99页| 色婷婷精品大在线视频| 国产盗摄在线观看| 久久精品欧美| 精品一区二区三区影院在线午夜| 中文字幕一区二区三区手机版| 亚洲日本欧美日韩高观看| 激情五月综合婷婷| 国产黄色特级片| 一区二区三区在线观看视频| 国产一区精品| 9a蜜桃久久久久久免费| 裸体素人女欧美日韩| 日本老熟俱乐部h0930| 亚洲精品在线看| 亚洲2区在线| 视色视频在线观看| 黄色一区二区三区| 亚洲精品白浆| 色综合视频二区偷拍在线|