亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

Swift中的指針操作詳解

2020-03-09 17:46:45
字體:
供稿:網(wǎng)友

前言

Objective-C和C語言經(jīng)常需要使用到指針。Swift中的數(shù)據(jù)類型由于良好的設(shè)計,使其可以和基于指針的C語言API無縫混用。但是語法上有很大的差別。

默認(rèn)情況下,Swift 是內(nèi)存安全的,這意味著它禁止我們直接操作內(nèi)存,并且確保所有的變量在使用前都已經(jīng)被正確地初始化了。但是,Swift 也提供了我們使用指針直接操作內(nèi)存的方法,直接操作內(nèi)存是很危險的行為,很容易就出現(xiàn)錯誤,因此官方將直接操作內(nèi)存稱為 “unsafe 特性”。

一旦我們開始直接操作內(nèi)存,一切就得靠我們自己了,因為在這種情況下編譯能給我們提供的幫助實在不多。正常情況下,我們在與 C 進(jìn)行交互,或者我們需要挖掘 Swift 內(nèi)部實現(xiàn)原理的時候會需要使用到這個特性。

Memory Layout

Swift 提供了 MemoryLayout 來檢測特定類型的大小以及內(nèi)存對齊大?。?/p>

MemoryLayout<Int>.size // return 8 (on 64-bit)MemoryLayout<Int>.alignment // return 8 (on 64-bit)MemoryLayout<Int>.stride // return 8 (on 64-bit)MemoryLayout<Int16>.size // return 2MemoryLayout<Int16>.alignment // return 2MemoryLayout<Int16>.stride // return 2MemoryLayout<Bool>.size // return 2MemoryLayout<Bool>.alignment // return 2MemoryLayout<Bool>.stride // return 2MemoryLayout<Float>.size // return 4MemoryLayout<Float>.size // return 4MemoryLayout<Float>.alignment // return 4MemoryLayout<Double>.stride // return 8MemoryLayout<Double>.alignment // return 8MemoryLayout<Double>.stride // return 8

MemoryLayout<Type> 是一個用于在編譯時計算出特定類型(Type)的 size, alignment 以及 stride 的泛型類型。返回的數(shù)值以字節(jié)為單位。例如 Int16 類型的大小為 2 個字節(jié),內(nèi)存對齊為 2 個字節(jié)以及當(dāng)我們需要連續(xù)排列多個 Int16 類型時,每一個 Int16 所需要占用的大小(stride)為 2 個字節(jié)。所有基本類型的 stride 都與 size 是一致的。

接下來,看看結(jié)構(gòu)體類型的 MemoryLayout:

struct EmptyStruct {}MemoryLayout<EmptyStruct>.size // returns 0MemoryLayout<EmptyStruct>.alignment // returns 1MemoryLayout<EmptyStruct>.stride // returns 1struct SampleStruct { let number: UInt32 let flag: Bool}MemoryLayout<SampleStruct>.size // returns 5MemoryLayout<SampleStruct>.alignment // returns 4MemoryLayout<SampleStruct>.stride // returns 8

空結(jié)構(gòu)體的大小為 0,內(nèi)存對齊為 1, 表明它可以存在于任何一個內(nèi)存地址上。有趣的是 stride 為 1,這是因為盡管結(jié)構(gòu)為空,但是當(dāng)我們使用它創(chuàng)建一個實例的時候,它也必須要有一個唯一的地址。

對于 SampleStruct,它所占的大小為 5,但是 stride 為 8。這是因為編譯需要為其填充空白的邊界,使其符合它的 4 字節(jié)內(nèi)存邊界對齊。

再來看看類:

class EmptyClass {}MemoryLayout<EmptyClass>.size // returns 8 (on 64-bit)MemoryLayout<EmptyClass>.alignment // returns 8 (on 64-bit)MemoryLayout<EmptyClass>.stride // returns 8 (on 64-bit)class SampleClass { let number: Int64 = 0 let flag: Bool = false}MemoryLayout<SampleClass>.size // returns 8 (on 64-bit)MemoryLayout<SampleClass>.aligment // returns 8 (on 64-bit)MemoryLayout<SampleClass>.stride // returns 8 (on 64-bit)

由于類都是引用類型,所以它所有的大小都是 8 字節(jié)。

關(guān)于 MemoryLayout 的更多詳細(xì)信息可以參考 Mike Ash 的演講。

指針

一個指針就是對一個內(nèi)存地址的封裝。在 Swift 當(dāng)中直接操作指針的類型都有一個 “unsafe” 前綴,所以它的指針類型稱為 UnsafePointer。這個前綴似乎看起來很令人惱火,不過這是 Swift 在提醒你,你現(xiàn)在正在跨越雷池,編譯器不會對這種操作進(jìn)行檢查,你需要對自己的代碼承擔(dān)全部的責(zé)任。

Swift 中包含了一打類型的指針類型,每個類型都有它們的作用和目的,使用適當(dāng)?shù)闹羔橆愋涂梢苑乐瑰e誤的發(fā)生并且更清晰地表達(dá)開發(fā)者的意圖,防止未定義行為的產(chǎn)生。

Swift 的指針類型使用了很清晰的命名,我們可以通過名字知道這是一個什么類型的指針??勺兓蛘卟豢勺儯?raw)或者有類型的,是否是緩沖(buffer)類型,這三種特性總共組合出了 8 種指針類型。

swift,指針操作,指針,swift3.0

接下來的幾個小節(jié)會詳細(xì)介紹這幾種指針類型。

使用原生(Raw)指針

在 Playground 中添加如下代碼:

// 1let count = 2let stride = MemoryLayout<Int>.stridelet alignment = MemoryLayout<Int>.alignmentlet byteCount = stride * count // 2do { print("Raw pointers")  // 3 let pointer = UnsafeMutableRawPointer.allocate(bytes: byteCount, alignedTo: alignment) // 4 defer { pointer.deallocate(bytes: byteCount, alignedTo: alignment) }  // 5 pointer.storeBytes(of: 42, as: Int.self) pointer.advanced(by: stride).storeBytes(of: 6, as: Int.self) pointer.load(as: Int.self) pointer.advanced(by: stride).load(as: Int.self)  // 6 let bufferPointer = UnsafeRawBufferPointer(start: pointer, count: byteCount) for (index, byte) in bufferPointer.enumerated() { print("byte /(index): /(byte)") }}

在這個代碼段中,我們使用了 Unsafe Swift 指針去存儲和讀取兩個整型數(shù)值。

接下來是對這段代碼的解釋:

1、聲明了接下來都會用到的幾個常量:

  • count 表示了我們要存儲的整數(shù)的個數(shù)
  • stride 表示了 Int 類型的 stride
  • alignment 表示了 Int 類型的內(nèi)存對齊
  • byteCount 表示占用的全部字節(jié)數(shù)

2、使用 do 來增加一個作用域,讓我們可以在接下的示例中復(fù)用作用域中的變量名

3、使用 UnsafeMutableRawPointer.allocate 方法來分配所需的字節(jié)數(shù)。我們使用了 UnsafeMutableRawPointer,它的名字表明這個指針可以用來讀取和存儲(改變)原生的字節(jié)。

4、使用 defer 來保證內(nèi)存得到正確地釋放。操作指針的時候,所有內(nèi)存都需要我們手動進(jìn)行管理。

5、storeBytes load 方法用于存儲和讀取字節(jié)。第二個整型數(shù)值的地址通過對 pointer 的地址前進(jìn) stride 來得到。因為指針類型是 Strideable 的,我們也可以直接使用指針?biāo)阈g(shù)運算 (pointer+stride).storeBytes(of: 6, as: Int.self)。

6、UnsafeRawBufferPointer 類型以一系列字節(jié)的形式來讀取內(nèi)存。這意味著我們可以這些字節(jié)進(jìn)行迭代,對其使用下標(biāo),或者使用 filter,map 以及 reduce 這些很酷的方法。緩沖類型指針使用了原生指針進(jìn)行初始化。

使用類型指針

我們可以使用類型指針實現(xiàn)跟上面代碼一樣的功能,并且更簡單:

do { print("Typed pointers")  let pointer = UnsafeMutablePointer<Int>.allocate(capacity: count) pointer.initialize(to: 0, count: count) defer { pointer.deinitialize(count: count) pointer.deallocate(capacity: count) }  pointer.pointee = 42 pointer.advanced(by: 1).pointee = 6 pointer.pointee pointer.advanced(by: 1).pointee  let bufferPointer = UnsafeBufferPointer(start: pointer, count: count) for (index, value) in bufferPointer.enumerated() { print("value /(index): /(value)") }}

注意到以下幾點不同:

  • 我們使用了 UnsafeMutablePointer.allocate 進(jìn)行內(nèi)存的分配。指定的泛型參數(shù)讓 Swift 知道我們將會使用這個指針來存儲和讀取 Int 類型的值。
  • 在使用類型指針前需要對其進(jìn)行初始化,并在使用后銷毀。這兩個功能分別是使用 initialize deinitialize 方法。
  • 類型指針提供了 pointee 屬性,它可以以類型安全的方式讀取和存儲值。
  • 當(dāng)需要指針前進(jìn)的時候,我們只需要指定想要前進(jìn)的個數(shù)。類型指針會自動根據(jù)它所指向的數(shù)值類型來計算 stride 值。同樣的,我們可以直接對指針進(jìn)行算術(shù)運算 (pointer + 1).pointee = 6 。
  • 有類型的緩沖型指針也會直接操作數(shù)值,而非字節(jié)

將原生指針轉(zhuǎn)換為類型指針

類型指針并不總是使用初始化得到的,它們可以從原生指針中轉(zhuǎn)化而來。

在 Playground 中添加如下代碼:

do { print("Converting raw pointers to typed pointers")  let rawPointer = UnsafeMutableRawPointer.allocate(bytes: byteCount, alignedTo: alignment) defer { rawPointer.deallocate(bytes: byteCount, alignedTo: alignment) }  let typedPointer = rawPointer.bindMemory(to: Int.self, capacity: count) typedPointer.initialize(to: 0, count: count) defer { typedPointer.deinitialize(count: count) }  typedPointer.pointee = 42 typedPointer.advanced(by: 1).pointee = 6 typedPointer.pointee typedPointer.advanced(by: 1).pointee  let bufferPointer = UnsafeBufferPointer(start: typedPointer, count: count) for (index, value) in bufferPointer.enumerated() { print("value /(index): /(value)") }}

這段代碼與上一段類似,除了它先創(chuàng)建了原生指針。我們通過將內(nèi)存綁定(binding)到指定的類型上來創(chuàng)建類型指針。通過對內(nèi)存的綁定,我們可以通過類型安全的方法來訪問它。將我們手動創(chuàng)建類型指針的時候,系統(tǒng)其實自動幫我們進(jìn)行了內(nèi)存綁定。

獲取一個實例的字節(jié)

很多時候我們需要從一個現(xiàn)存的實例里獲取它的字節(jié)。這時可以使用 withUnsafeBytes(of:) 方法。

在 Playground 中添加如下代碼:

do { print("Getting the bytes of an instance")  var sampleStruct = SampleStruct(number: 25, flag: true)  withUnsafeBytes(of: &sampleStruct) { bytes in for byte in bytes { print(byte) } }}

這段代碼會打印出 SampleStruct 實例的原生字節(jié)。withUnsafeBytes(of:) 方法可以獲取到 UnsafeRawBufferPointer并傳入閉包中供我們使用。

withUnsafeBytes 同樣適合用 Array Data 的實例。

使用 Swift 操作指針的三大原則

當(dāng)我們使用 Swift 操作指針的時候必須加倍小心,防止寫出未定義行為的代碼。下面是幾個壞代碼的示例。

不要從 withUnsafeBytes 中返回指針

 // Rule #1do { print("1. Don't return the pointer from withUnsafeBytes!")  var sampleStruct = SampleStruct(number: 25, flag: true)  let bytes = withUnsafeBytes(of: &sampleStruct) { bytes in return bytes // strange bugs here we come ?????? }  print("Horse is out of the barn!", bytes) /// undefined !!!}

絕對不要讓指針逃出 withUnsafeBytes(of:) 的作用域范圍。這樣的代碼會成為定時炸彈,你永遠(yuǎn)不知道它什么時候可以用,而什么時候會崩潰。

一次只綁定一種類型

// Rule #2do { print("2. Only bind to one type at a time!")  let count = 3 let stride = MemoryLayout<Int16>.stride let alignment = MemoryLayout<Int16>.alignment let byteCount = count * stride  let pointer = UnsafeMutableRawPointer.allocate(bytes: byteCount, alignedTo: alignment)  let typedPointer1 = pointer.bindMemory(to: UInt16.self, capacity: count)  // Breakin' the Law... Breakin' the Law (Undefined behavior) let typedPointer2 = pointer.bindMemory(to: Bool.self, capacity: count * 2)  // If you must, do it this way: typedPointer1.withMemoryRebound(to: Bool.self, capacity: count * 2) { (boolPointer: UnsafeMutablePointer<Bool>) in print(boolPointer.pointee) // See Rule #1, don't return the pointer }}**絕對不要**讓一個內(nèi)存同時綁定兩個不同的類型。如果你需要臨時這么做,可以使用 `withMemoryRebound(to:capacity:)` 來對內(nèi)存進(jìn)行重新綁定。并且,這條規(guī)則也表明了不要將一個基本類型(如 Int)重新綁定到一個自定義類型(如 class)上。不要做這種傻事。### 不要操作超出范圍的內(nèi)存```swift/137587.html">swift// Rule #3... waitdo { print("3. Don't walk off the end... whoops!")  let count = 3 let stride = MemoryLayout<Int16>.stride let alignment = MemoryLayout<Int16>.alignment let byteCount = count * stride  let pointer = UnsafeMutableRawPointer.allocate(bytes: byteCount, alignedTo: alignment) let bufferPointer = UnsafeRawBufferPointer(start: pointer, count: byteCount + 1) // OMG +1????  for byte in bufferPointer { print(byte) // pawing through memory like an animal }}

這是最糟糕的一種錯誤了,請再三檢查你的代碼,保證不要有這種情況出現(xiàn)。切記。

示例:隨機(jī)數(shù)生成

隨機(jī)數(shù)在很多地方都有重要的作用,從游戲到機(jī)器學(xué)習(xí)。macOS 提供了 arc4random 方法用于隨機(jī)數(shù)生成。不幸的是,這個方法無法在 Linux 上使用。并且,arc4random 方法只提供了 UInt32 類型的隨機(jī)數(shù)。事實上,/dev/urandom 這個設(shè)備文件中就提供了無限的隨機(jī)數(shù)。

這一小節(jié)中,我們將使用指針讀取這個文件,并產(chǎn)生完全類型安全的隨機(jī)數(shù)。

swift,指針操作,指針,swift3.0

創(chuàng)建一個新 Playground,命名為 RandomNumbers,并確保選擇了 macOS 平臺。

創(chuàng)建完成后,添加如下代碼:

import Foundation enum RandomSource {  static let file = fopen("/dev/urandom", "r")! static let queue = DispatchQueue(label: "random")  static func get(count: Int) -> [Int8] { let capacity = count + 1 // fgets adds null termination var data = UnsafeMutablePointer<Int8>.allocate(capacity: capacity) defer { data.deallocate(capacity: capacity) } queue.sync { fgets(data, Int32(capacity), file) } return Array(UnsafeMutableBufferPointer(start: data, count: count)) }}

為了確保整個系統(tǒng)中只存在一個 file 變量,我們對其使用了 static 修飾符。系統(tǒng)會在我們的進(jìn)程結(jié)束時關(guān)閉文件。因為我們有可能在多個線程中同時獲取隨機(jī)數(shù),所以需要使用一個串行的 GCD 隊列來進(jìn)行保護(hù)。

get 函數(shù)是所有功能完成的地方。首先,我們根據(jù)傳入的大小分配了必要的內(nèi)存,注意這里需要 +1 是因為 fets 函數(shù)總是以 /0 結(jié)束。接下來,我們就使用 fgets 函數(shù)從文件中讀取數(shù)據(jù),確保我們在串行隊列中進(jìn)行讀取操作。最后,我們先將數(shù)據(jù)封裝為一個 UnsafeMutableBufferPointer,并將其轉(zhuǎn)化為一個數(shù)組。

在 playground 的最后添加如下代碼:

extension Integer {  static var randomized: Self { let numbers = RandomSource.get(count: MemoryLayout<Self>.size) return numbers.withUnsafeBufferPointer { bufferPointer in return bufferPointer.baseAddress!.withMemoryRebound(to: Self.self, capacity: 1) { return $0.pointee } } } } Int8.randomizedUInt8.randomizedInt16.randomizedUInt16.randomizedInt16.randomizedUInt32.randomizedInt64.randomizedUInt64.randomized

這里我們?yōu)?Integer 協(xié)議添加了一個靜態(tài)屬性,并為其提供了默認(rèn)實現(xiàn)。我們首先獲取了隨機(jī)數(shù),隨后我們將獲得字節(jié)數(shù)組重新綁定為所需要的類型,然后返回它的值。簡單!

就這樣,我們使用 unsafe Swift 實現(xiàn)了一個類型安全的隨機(jī)器生成方法。

在日常開發(fā)中,我們并不會接觸到很多直接操作內(nèi)存的情境。但是掌握它的操作,能讓我們在碰到類似代碼里更加從容。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。


注:相關(guān)教程知識閱讀請移步到swift教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
99re亚洲国产精品| 国产精品一区二区你懂得| 日韩av电影免费观看高清完整版| 午夜国产精品视频免费体验区| 日本加勒比一区| 国产精品久久久久77777丨| 亚洲图片视频小说| 欧美激情第一页在线观看| 91九色视频在线观看| 日一区二区三区| 男人天堂av片| 国产精品美女一区二区视频| 国产成人三级| 在线视频国产一区| 北条麻妃69av| 欧美大黑bbbbbbbbb在线| 精品中文字幕av| 天堂色在线视频| 国产精品久久久久久久av电影| 一区二区三区免费看视频| 国产麻豆成人精品| xxxxxwwww免费视频| 手机在线免费看片| 精品少妇一区二区三区密爱| 国产偷v国产偷v亚洲高清| 日韩一区二区电影在线观看| 激情视频一区二区三区| 亚洲欧美日韩精品久久奇米色影视| 国产成人无码精品久久久久| 欧美伊人精品成人久久综合97| 国产熟人av一二三区| 欧美日本精品一区二区三区| 蜜桃无码一区二区三区| 天天干天天草天天射| 福利av在线| 无码国精品一区二区免费蜜桃| 成年人网站大全| 一级黄色大片视频| 美女毛片一区二区三区四区最新中文字幕亚洲| 欧美资源在线观看| 欧美成人综合色| 国内揄拍国内精品少妇国语| 久久久青草青青国产亚洲免观| 欧美激情国产高清| 欧美中文字幕第一页| 天天干,夜夜操| 5g成人永久免费影院| 日韩大片免费观看| 牛牛影视精品影视| 亚洲91精品在线观看| 丰满肉嫩西川结衣av| 亚洲一区免费在线| 久久男人资源视频| 蜜臀久久久99精品久久久久久| 最新黄色av网址| 国模视频一区二区三区| 亚洲天堂日韩av| 国产精品免费精品自在线观看| 欧日韩不卡在线视频| 日韩在线视频免费| 成人av在线亚洲| 国产伦精品一区二区三区88av| 欧美三级电影在线看| 国产精品国模大尺度私拍| 亚洲国产欧美在线观看| 日本午夜精品视频| 国产国产国产国产国产国产| 国产草草影院ccyycom| 欧美三级伦理在线| 中文字幕免费精品| 亚洲欧美99| 热re99久久国产精品| 国产黄色在线播放| 国产欧美精品xxxx另类| 日韩视频在线永久播放| 91社区国产高清| 欧美精品国产精品日韩精品| 国产中文字幕第一页| wwwww在线观看免费视频| 九九久久久久久久久激情| 欧美欧美黄在线二区| 性中国xxx极品hd| 天天看片天天操| 欧美亚洲国产免费| www.国产毛片| 北岛玲heyzo一区二区| 亚洲一区视频在线观看视频| 欧美性猛交xxxx偷拍洗澡| 在线亚洲色图| 天天操天天爽天天干| 日本电影欧美片| 性欧美高清视频| 成人午夜精品久久久久久久蜜臀| 粉嫩欧美一区二区三区| 尤物视频免费| 亚洲午夜精品久久久久久app| 国产福利一区二区三区| 久久狠狠久久综合桃花| 亚洲欧美自拍一区| www.九色.com| 精品国产精品三级精品av网址| 人妻少妇精品无码专区二区| 天天看天天操| 男裸体无遮挡网站| 国产精品99久久久久久有的能看| 国产精品免费av一区二区| 国精品无码人妻一区二区三区| 先锋影音在线播放av| 日本高清好狼色视频| 性网站在线免费观看| 中文一区二区在线观看| 日韩不卡在线播放| 亚洲精品一区av| 色av一区二区| 亚洲精选视频免费看| 亚州av中文字幕在线免费观看| 国产精品稀缺呦系列在线| 久久久国产精品成人免费| 国产999在线观看| 手机看片福利永久国产日韩| 免播放器亚洲一区| 亚洲免费av高清| 日韩av中文字幕第一页| 日本在线中文字幕一区二区三区| 欧美一级黄色录像片| 国产麻豆一区二区三区精品| 欧美另类videosbestsex日本| 欧美aaaaaaaaaaaa| 国产亚洲一区在线| 亚洲自拍另类欧美丝袜| 6080yy午夜一二三区久久| 日韩理论片久久| 美女被c出白浆| 一起操在线观看| 在线精品国精品国产尤物884a| 在线观看三级视频欧美| 麻豆传媒在线视频| 美女日韩在线中文字幕| 免费福利影院| 在线看中文字幕| 在线亚洲精品福利网址导航| 91tv亚洲精品香蕉国产一区7ujn| 国产亚洲日本欧美韩国| 色综合久久久久久中文网| 性感美女激情视频在线观看| 韩国女主播成人在线观看| 无限资源日本好片| 久久久综合亚洲91久久98| 日本视频在线观看免费| 国产高清免费在线| 日韩精品福利| 久久久久亚洲AV成人无在| 免费福利在线视频| www.成人黄色| 国产精品美女久久久久久久网站| 在线观看av中文字幕| 97久久人人超碰caoprom欧美| 91亚洲一区二区| 国产成人女人毛片视频在线| 日韩精品久久久久久久软件91| 久久精品国产成人av| 日韩欧美亚洲区| 国产在线视频网址| 国产精品久久久久久一区二区| 婷婷久久综合网| 99re6热在线精品视频播放| 亚洲成人久久网| 2019国产精品自在线拍国产不卡| 久久亚洲图片| 亚洲三区在线观看| 久草视频免费在线播放| 亚洲视频一二区| 五月天国产精品| 亚洲网友自拍| 午夜精品aaa| 调教+趴+乳夹+国产+精品| 久久大香伊蕉在人线观看热2| 日本a人精品| 国产精品国色综合久久| 亚洲淫片在线视频| 久久精品国产一区| www.青青草| 久久久久国产视频| 久久人妻少妇嫩草av无码专区| 国产亚洲精品91在线| 九九热国产视频| 成人av福利| 图片小说视频色综合| 欧美亚洲大陆| 国产精品99久| 国产三线在线| 国产中文在线播放| 欧美激情视频免费观看| 极品少妇xxxx精品少妇偷拍| 亚洲精品中文字幕乱码三区| 国色天香久久精品国产一区| 日韩免费毛片| 久艹在线免费观看| 亚洲精品在线视频观看| 日本不卡一区二区三区视频| 污视频在线看操| 欧美三级韩国三级日本三斤在线观看| 香蕉久久夜色精品| 久久亚洲综合网| 宅男在线精品国产免费观看| 91麻豆精品国产91久久久久久| 一级日韩一级欧美| 精品久久香蕉国产线看观看亚洲| 丝袜美腿美女被狂躁在线观看| 欧美精品a∨在线观看不卡| 激情六月丁香婷婷| 无码国产精品一区二区高潮| 狠狠综合久久av一区二区蜜桃| 首页欧美精品中文字幕| 美女视频黄免费的久久| 巨胸喷奶水www久久久免费动漫| 免费在线看一区| 欧美丰满少妇xxxxx做受| 牛人盗摄一区二区三区视频| 国产一区观看| 视频一区二区不卡| 国产精欧美一区二区三区蓝颜男同| jizz中文字幕| 美女一区二区视频| 国内久久婷婷综合| 色欲av伊人久久大香线蕉影院| 成人精品久久久| 欧美影院一区二区| 五月天婷婷在线视频| 欧美激情综合色综合啪啪五月| 91久久久久久久久久久久久| 天天操天天操天天操天天| 国产精品网曝门| 欧美黑人国产人伦爽爽爽| 麻豆传媒在线免费| 尤物在线精品视频| 成人h精品动漫一区二区三区| 中文精品视频一区二区在线观看| 99久久国产综合精品女不卡| 老司机在线精品视频| 色8久久久久| 91麻豆天美传媒在线| 国产视频1区2区3区| 日本不卡一区二区在线观看| 亚洲欧美另类久久久精品| 超碰免费在线97| 91一区二区三区在线播放| 国产亚洲成人精品| 99v久久综合狠狠综合久久| 日本xxxxwwww| 免费在线不卡av| 精品黄色免费中文电影在线播放| 久久久久久久久黄色| 四虎影院观看视频在线观看| 欧美一区 二区 三区| 国产片侵犯亲女视频播放| 亚洲精品在线一区二区| 国产精品亚洲视频| 日韩三级影视| 国语自产精品视频在线看抢先版图片| 国产乱子伦视频一区二区三区| 啊啊啊久久久| 欧美在线a视频| bdsm在线观看播放视频| 亚洲一区二区在线播放相泽| 亚洲欧美久久久久一区二区三区| 成人白浆超碰人人人人| 日韩理论片在线观看| 国产免费黄色av| 欧美性猛交xxxxbbb| 日韩视频一二三| 农村老熟妇乱子伦视频| 黄色成人av在线| 中文字幕在线视频观看| 中文字幕欧美人妻精品| 欧洲生活片亚洲生活在线观看| 久久综合网络一区二区| 国产精品嫩草影院久久久| 欧美韩国日本综合| 国产精品亚洲综合天堂夜夜| 岛国av在线一区| 国产精品国产三级国产传播| 成年网站免费入口在线观看| 国精品无码一区二区三区| 九色丨porny丨| 国产成人在线中文字幕| 欧美性色黄大片| 成人深夜直播免费观看| 亚洲欧美自拍视频| 欧美黑人乱大交| 亚洲最大成人免费视频| 久久精品国产美女| 黄色成人av在线| 国产九色91回来了| 国产一级生活片| 精品福利一区二区| 深夜福利日韩在线看| 一级做a爰片久久毛片16| 国产精品电影一区| 国产精品theporn动漫| 亚洲综合电影一区二区三区| 悠悠资源网久久精品| 色婷婷精品久久二区二区密| 欧美激情免费观看| 91国偷自产一区二区使用方法| 亚洲jizzjizz妇女| 大桥未久一区二区三区| 国产又粗又猛又爽又黄91| 亚洲日产国产精品| 日本欧美久久久久免费播放网| 九九热最新视频| 不卡的一区二区| 中文字幕求饶的少妇| 日本三级中文字幕在线观看| 一区在线视频| 黄色影片网址| 99精品在线| 91精品国产乱码久久久久久蜜臀| 亚洲九九爱视频| 欧美丝袜足交| 亚洲精品免费观看| 日本一区二区三区电影免费观看| 国产又粗又猛大又黄又爽| 自拍自偷一区二区三区| 亚洲缚视频在线观看| 96av在线| 日本18中文字幕| 免费在线亚洲欧美|