国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

你真的了解泛型 Generic 嘛?

共 15647字,需瀏覽 32分鐘

 ·

2021-08-03 19:35

泛型 Generic Programming[1] 通常指允許程序員在強(qiáng)類型程序設(shè)計(jì)語言中,編寫代碼時(shí)使用一些以后才指定的類型,在實(shí)例化時(shí)作為參數(shù)指明這些類型,即類型參數(shù)化

首先我們不是科班討論學(xué)術(shù),有些概念比較模糊也正常,本文討論的內(nèi)容意在給大家提供全局的視野看待泛型 Generic, 大致了解主流語言的實(shí)現(xiàn)

泛型會(huì)提供哪些便利呢?上面的動(dòng)圖非常經(jīng)典,比如 min 函數(shù),如果沒有泛型,需要針對(duì) int, float, string 分別寫出不同的特定實(shí)現(xiàn),代碼非常冗余。本文會(huì)討論下為什么 go 需要泛型以及 go2 泛型的 proposal[2]

CPP 模板

#include <iostream>
template <class T>
T max(T a,T b){

  T ret = a > b? a : b;
  std::cout<< a << " and " << b <<" max is " << ret << std::endl;
  return ret;
}
int main(){
  max(1,2);  // 整數(shù)
  max(1.2,2.3); // 浮點(diǎn)數(shù)
  return 0;
}

上面是 cpp 模板實(shí)現(xiàn)的 max 泛型函數(shù),傳入 int, float 都可以工作

$ c++ max.cpp  -o max && ./max
1 and 2 max is 2
1.2 and 2.3 max is 2.3

運(yùn)行結(jié)果如上所示,同樣代碼換成 go 肯定就是錯(cuò)的,本質(zhì)是模板在編譯期單態(tài)化,針對(duì)每個(gè)特定類型生成了特定函數(shù)

$ nm max | grep -i max
0000000100000f90 T __Z3maxIdET_S0_S0_
0000000100000ef0 T __Z3maxIiET_S0_S0_
$ c++filt __Z3maxIdET_S0_S0_
double max<double>(double, double)
$ c++filt __Z3maxIiET_S0_S0_
int max<int>(int, int)

通過 nm 查看二進(jìn)制的符號(hào)表,生成了兩個(gè)函數(shù),簽名分別是 double max<double>(double, double), int max<int>(int, int)

CPP 模板非常強(qiáng)大,但是也有缺點(diǎn),比如二進(jìn)制膨脹的厲害,有可能影響到 cpu icache, 業(yè)務(wù)代碼無所謂了。另外 T 沒有其它語言的 constraint 或 bounded, 比如要求 T 必須實(shí)現(xiàn)某些方法,然后函數(shù)內(nèi)只能調(diào)用這些顯示的約束(C++20 會(huì)引入 concepts 實(shí)現(xiàn)約束)

C 怎么實(shí)現(xiàn)

C 嚴(yán)格意義上沒有實(shí)現(xiàn),但在 C11 標(biāo)準(zhǔn)中引入了 _Generic 泛型選擇器,閹割版的實(shí)現(xiàn)

#include <stdio.h>
// int類型加法
int addI(int a, int b)
{
    printf("%d + %d = %d\n",a,b, a + b );
    return (a + b);
}
// double類型加法
double addF(double a, double b)
{
    printf("%f + %f = %f\n",a,b, a + b );
    return (a + b);
}
void unsupport(int a,int b)
{
    printf("unsupport type\n");
}
#define ADD(a,b) _Generic((a), \
    int:addI(a,b),\
    double:addF(a,b), \
    default:unsupport(a,b))

int main(void)
{
    ADD(1 , 2);
    ADD(1.1,2.2);
    return 0;
}

上面是實(shí)現(xiàn)的 ADD 方法,只是調(diào)用的時(shí)候看起來是泛型了。這種實(shí)現(xiàn)是有缺點(diǎn)的,c 會(huì)做很多隱式轉(zhuǎn)換,即使你傳入字符串,也會(huì)編譯成功,并且取得一個(gè)值。并沒有在編譯期確保類型 a, b 一致

同時(shí)由于 c 不支持函數(shù)名重載,還要人工編寫特定實(shí)例的函數(shù) addF, addI, 并且二進(jìn)制的符號(hào)表并沒有 ADD. 類比 cpp 是由編譯器替我們完成

在 C11 以前的標(biāo)準(zhǔn)中,很多代碼都是用 void * 實(shí)現(xiàn),問題在于 void 是沒有類型信息的,需要增加特定的函數(shù)指針回調(diào),讓我們來看 redis 例子

typedef struct dictType {
    uint64_t (*hashFunction)(const void *key);
    void *(*keyDup)(void *privdata, const void *key);
    void *(*valDup)(void *privdata, const void *obj);
    int (*keyCompare)(void *privdata, const void *key1, const void *key2);
    void (*keyDestructor)(void *privdata, void *key);
    void (*valDestructor)(void *privdata, void *obj);
} dictType;


typedef struct dict {
    dictType *type;
    void *privdata;
    dictht ht[2];
    long rehashidx; /* rehashing not in progress if rehashidx == -1 */
    unsigned long iterators; /* number of iterators currently running */
} dict;

上面的代碼來自 redis dict[3], 字典是泛型的,value 可以是任意類型,只要實(shí)現(xiàn)了 dictType 定義的函數(shù)指針。內(nèi)核里面也有大量類似實(shí)現(xiàn),非常通用

Rust 實(shí)現(xiàn)

Rust 泛型也同樣編譯期單態(tài)化,運(yùn)行時(shí)沒有開銷

fn printer<T: Display>(t: T) {
    println!("{}", t);
}

這里定義函數(shù) printer, 類型 T 必須實(shí)現(xiàn)了 Display trait, 這就是所謂的 constraint 或者 bounded

impl <A, D> MyTrait<A, D> for YourType where
    A: TraitB + TraitC,
    D: TraitE + TraitF {
    
}

但假如需要滿足多個(gè)約束的時(shí)候,在 <> 里寫就很不簡(jiǎn)潔,需要使用 where[4] 關(guān)鍵字

Rust 很多時(shí)候難懂,就是因?yàn)榀B加了泛型,生命周期,所有權(quán),還有很多的 wrapper, 別說寫了,讀都讀不懂

Java 版本

Java 在 1.5 版本引入了泛型,它的泛型是用類型擦除實(shí)現(xiàn)的。Java 的泛型只是在編譯期間用于檢查類型的正確,為了保證與舊版本 JVM 的兼容,類型擦除會(huì)刪除泛型的相關(guān)信息,導(dǎo)致其在運(yùn)行時(shí)不可用。關(guān)于這塊可以參考 大神R大的回答[5], 早就有類似 cpp 實(shí)現(xiàn),只是涉及兼容上的取舍,不得不這么做

編譯器會(huì)插入額外的類型轉(zhuǎn)換指令,與 C 語言和 C++ 在運(yùn)行前就已經(jīng)實(shí)現(xiàn)或者生成代碼相比,Java 類型的裝箱和拆箱會(huì)降低程序的執(zhí)行效率。非 Java 黨就不寫太多了

Go 為什么需要泛型

官方要在 go1.18 引入泛型,那現(xiàn)在我們是怎么用的呢?很多時(shí)候就是 copy 代碼,或者用 interface{} 代替

func Max(a , b Comparable) Comparable

比如常見的 Max 函數(shù),傳入?yún)?shù) a, b 都實(shí)現(xiàn)了 Comparable 接口,然后返回最大值。能工作不?能,但是有問題

  1. 丟失了類型信息,原來 cpp/rust 的實(shí)現(xiàn),在函數(shù)中操作的都是原始類型,如果用 interface 還需要斷言,這是運(yùn)行時(shí)行為,性能損失很大
  2. 表達(dá)力不夠,比如 a, b 不能確保是同一個(gè)類型,可能一個(gè)是 int, 另外一個(gè)是 struct. 如果想傳入的是類型組合呢?

再看一個(gè) interface{} 不能當(dāng)成泛型的例子

func sort(arr []interface{})

這個(gè)排序函數(shù)如果傳入 sort([]int{1,2,3}) 或是 sort([]float64{1.032, 3.012}) 都會(huì)報(bào)錯(cuò),原因是什么呢???

在 go 中 []interface{} 類型是 slice 不是 interface{}, go 中對(duì)比接口相等時(shí),是判斷 itab 中 type 和 data 需要都一致。換句話說,不允許類型的協(xié)變(沒其它語言背景的不必糾結(jié)概念,在 Go2 中也不打算支持協(xié)變和逆變)

同時(shí)社區(qū)還有其它庫(kù)輔助,比如 genny[6]betterGO[7], 本質(zhì)還是上面的動(dòng)圖

// NOTE: this is how easy it is to define a generic type
type Something generic.Type

// SomethingQueue is a queue of Somethings.
type SomethingQueue struct {
  items []Something
}

func NewSomethingQueue() *SomethingQueue {
  return &SomethingQueue{items: make([]Something, 0)}
}
func (q *SomethingQueue) Push(item Something) {
  q.items = append(q.items, item)
}
func (q *SomethingQueue) Pop() Something {
  item := q.items[0]
  q.items = q.items[1:]
  return item
}

上面定義了一個(gè)泛型 type Something generic.Type, 然后用 go generate 生成對(duì)應(yīng)的泛型代碼

cat source.go | genny gen "Something=string"
// StringQueue is a queue of Strings.
type StringQueue struct {
  items []string
}

func NewStringQueue() *StringQueue {
  return &StringQueue{items: make([]string0)}
}
func (q *StringQueue) Push(item string) {
  q.items = append(q.items, item)
}
func (q *StringQueue) Pop() string {
  item := q.items[0]
  q.items = q.items[1:]
  return item
}

最后替換相應(yīng)的類型,生成對(duì)應(yīng)源碼文件,人肉模板騷不騷^^

Go2 泛型

泛型討論了很久,參見 generic programming facilities[8], Why Generics[9], Next Step[10], 以及官方 proposal[11], 這是最終版,語法上不會(huì)再改變。為了運(yùn)行時(shí)性能,go 的實(shí)現(xiàn)類似 rust 編譯期單態(tài)化,而且為了兼容 go1 語法也會(huì)做一些妥協(xié)。如果近期想閱讀源碼的,不如等到明年 go1.18, 因?yàn)橐敕盒驮创a庫(kù)變更會(huì)很大

1.Multiple type parameters

// Print prints the elements of any slice.
// Print has a type parameter T and has a single (non-type)
// parameter s which is a slice of that type parameter.
func Print[T any](s []T) {
 ......
}

類型參數(shù)列表,放到中括號(hào)里 [], 其中 T 是類型,any 關(guān)鍵字是表示可以傳入任意類型。居然不是業(yè)界通用的尖括號(hào) <> 感覺非常丑... 其中 any 其實(shí)就是 interface{} 空接口,寫起來相對(duì)方便,而且語意上表達(dá)更準(zhǔn)確一些

// Print2 has two type parameters and two non-type parameters.
func Print2[T1T2 any](s1 []T1, s2 []T2) { ... }
// Print2Same has one type parameter and two non-type parameters.
func Print2Same[T any](s1 []T, s2 []T) { ... }

Print2 中可以傳入相同或不同的類型,比如 Print2[int, int]Print2[int, string] 都是允許的

但是 Print2Same 的參數(shù) s1, s2 類別必然要相同,編譯期保證。這也就是上面提到 go1 時(shí) interface{} 模擬泛型的問題

2.Constraint

func Stringify[T any](s []T) (ret []string) {
 for _, v := range s {
  ret = append(ret, v.String()) // INVALID
 }
 return ret
}

這個(gè)例子是不會(huì)編譯成功的,因?yàn)?T 是任意類型,并沒有實(shí)現(xiàn) String() 方法。也就是說,泛型函數(shù)只允許調(diào)用 constraint 約束里顯示指定的方法 這樣的好處是,對(duì)于大型項(xiàng)目的構(gòu)建,不會(huì)因?yàn)殡[式的改動(dòng),而改變兼容性

相比于 rust where 語句,go 中增加了類型參數(shù)列表和接口的組合,做為約束

package constraints

// Ordered is a type constraint that matches any ordered type.
// An ordered type is one that supports the <, <=, >, and >= operators.
type Ordered interface {
 type intint8int16int32int64,
  uintuint8uint16uint32uint64uintptr,
  float32float64,
  string
}

上面是約束的定義,關(guān)鍵字 type 后面跟上允許的類型列表,不知道為啥就是丑。其它語言用到哪個(gè)類型,編譯期單態(tài)就好了,go 需要人工枚舉所有可能...

// Smallest returns the smallest element in a slice.
// It panics if the slice is empty.
func Smallest[T constraints.Ordered](s []T) T {
 r := s[0// panics if slice is empty
 for _, v := range s[1:] {
  if v < r {
   r = v
  }
 }
 return r
}

3.泛型類型

上面提到的都是 Generic Func, 另一個(gè)使用場(chǎng)景是泛型類型 Generic Type

// Vector is a name for a slice of any element type.
type Vector[T any] []T

上面標(biāo)準(zhǔn)的泛型容器定義,類似其它語言的 Vector

// Push adds a value to the end of a vector.
func (v *Vector[T]) Push(x T) { *v = append(*v, x) }

同樣,泛型類型還可以定義方法

// List is a linked list of values of type T.
type ListNode[T] {xxx}
type List[T] struct {
    head *ListNode[T]
    tail *ListNode[T]
    size int
}


// This type is INVALID.
type P[T1, T2 any] struct {
 F *P[T2, T1] // INVALID; must be [T1, T2]
}

上面是定義的 struct 語法,比較相似。但如果泛型類型,有指向自己的指針,那么注意參數(shù)順序也要一樣,P[T1, T2 any] 這樣寫的,那么指針也要 *[T1, T2]. 官方說防止類型實(shí)例化的遞歸

4.Comparable types in constraints

Go 不允許重載操作符,這樣好處多多。但同時(shí)代表著大于,小于這些只適用于基本類型。但也有例外 ==, != 可以比較 struct, array, interface. 官方在標(biāo)準(zhǔn)庫(kù)預(yù)定義了約束 comparable 用于比較

// Index returns the index of x in s, or -1 if not found.
func Index[T comparable](s []T, x T) int {
 for i, v := range s {
  // v and x are type T, which has the comparable
  // constraint, so we can use == here.
  if v == x {
   return i
  }
 }
 return -1
}

上面的例子很清晰明了,T 實(shí)現(xiàn)了比較接口,就可以用 ==

// ComparableHasher is a type constraint that matches all
// comparable types with a Hash method.
type ComparableHasher interface {
 comparable
 Hash() uintptr
}
// ImpossibleConstraint is a type constraint that no type can satisfy,
// because slice types are not comparable.
type ImpossibleConstraint interface {
 comparable
 type []int
}

用 interface 實(shí)現(xiàn)約束,上面的例子是 hasher 接口,下面的接口是永遠(yuǎn)不能實(shí)現(xiàn)的,很好理解,類型 []int 是不能比較的

5.類型推導(dǎo) type inference

類型推導(dǎo)很重要,可以省略很多無用代碼,編譯器自動(dòng)識(shí)別類型

func Map[FT any](s []F, f func(F) T) []T { ... }

這是一個(gè) Map 算子函數(shù)的簽名,f 匿名函數(shù),將 []F 轉(zhuǎn)換成 []T 類型 slice

 var s []int
 f := func(i int) int64 { return int64(i) }
 var r []int64
 // Specify both type arguments explicitly.
 r = Map[intint64](s, f)
 // Specify just the first type argument, for F,
 // and let T be inferred.
 r = Map[int](s, f)
 // Don't specify any type arguments, and let both be inferred.
 r = Map(s, f)

最理想只需要調(diào)用 r=Map(s, f) 就可以,否則還要寫 r = Map[int, int64](s, f), 能推導(dǎo)的就不要讓人寫

除了上面的,再舉個(gè)例子比如 T1, T2 是兩個(gè)類型參數(shù),那么 []map[int]bool 可以和以下類型統(tǒng)一 unified 起來

  • []map[int]bool 這個(gè)就是類型自身,很好理解
  • T1 當(dāng)然可以匹配
  • []T1 T1 匹配到 map[int]bool
  • []map[T1]T2 這里 T1 是 int, T2 是 bool

上面只是幾種可能,但同時(shí)不能匹配到 int, struct{}, []map[T1]string 這也是顯而易見的。雖然 go2 不支持協(xié)變,但是基于類型推導(dǎo)還是比 go1 方便的多

6.type lists 組合

// StringableSignedInteger is a type constraint that matches any
// type that is both 1) defined as a signed integer type;
// 2) has a String method.
type StringableSignedInteger interface {
 type intint8int16int32int64
 String() string
}

約束還可以將 類型列表 與普通的接口函數(shù)組合起來。上面的 StringableSignedInteger 要求約束,必須是 type list 里的任一類型,同時(shí)實(shí)現(xiàn)了 String() string 函數(shù)

問題是 int 這些都沒有 string 方法,所以上面約束其實(shí)是 impossible 的,只是舉例子說明如何使用

7.未實(shí)現(xiàn)部份

官方還列舉了很多 omissions[12] 未實(shí)現(xiàn)的點(diǎn)

比如不支持:特化,元編程(cpp 玩爛了),curry 柯立化等等,泛型分享內(nèi)容大致這些,感興趣直接看官網(wǎng)好了

泛型代價(jià)

引入泛型不是沒有代價(jià)的,都是取舍,好在 go 語言誕生才十年,沒有很重的歷史包袱

  • Slow Compiler: 這是 c++/rust 泛型
  • Slow Performance: 這是 java/scala 泛型
  • Slow Programmer: 這是 go1

但 go 真的需要泛型嘛?雖然 go 定位是系統(tǒng)語言,用的最多還是偏業(yè)務(wù)層,中間件以下還是 c/c++ 的舞臺(tái),哪怕 go 己經(jīng)有了殺手級(jí)應(yīng)用 docker/k8s

吸引大公司選擇 go 的原因,就是簡(jiǎn)單,快速上手,goroutine 用戶態(tài)高并發(fā)。如果 GA 后,會(huì)不會(huì)導(dǎo)致代碼庫(kù)里泛型使用泛濫呢?可以預(yù)見,go1.18 出來后,大家要刷新對(duì) go 的認(rèn)識(shí)了,同時(shí)對(duì)于新手學(xué)習(xí)區(qū)線也不再簡(jiǎn)單

支持泛型也會(huì)讓 go 很好的處理數(shù)據(jù),要是再搞個(gè)分代 GC, 是不是可以造大數(shù)據(jù)的輪子了^^

小結(jié)

引用曹大[13]的一句話:敏捷大師們其實(shí)非常雙標(biāo),他們給出的方法論也不一定靠譜,反正成功了就是大師方法得當(dāng),失敗了就是我們執(zhí)行不力沒有學(xué)到精髓。正著說反著說都有道理。

再看看現(xiàn)在的 Go 社區(qū),buzzwords 也很多,如果一個(gè)特性大師不想做,那就是 less is more. 如果一個(gè)特性大師想做,那就是 orthogonal, 非??陀^

寫文章不容易,如果對(duì)大家有所幫助和啟發(fā),請(qǐng)大家?guī)兔c(diǎn)擊在看點(diǎn)贊分享 三連

關(guān)于 泛型 大家有什么看法,歡迎留言一起討論,大牛多留言 ^_^

參考資料

[1]

泛型程序設(shè)計(jì): https://zh.wikipedia.org/wiki/%E6%B3%9B%E5%9E%8B%E7%BC%96%E7%A8%8B,

[2]

go2 泛型最終提案: https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md,

[3]

redis disct: https://github.com/redis/redis/blob/unstable/src/dict.h#L61,

[4]

rust where: https://rustwiki.org/zh-CN/rust-by-example/generics/where.html,

[5]

Java 不能實(shí)現(xiàn)真正泛型的原因是什么?: https://www.zhihu.com/question/28665443/answer/118148143,

[6]

genny: https://github.com/cheekybits/genny,

[7]

betterGO: https://github.com/PioneerIncubator/betterGo,

[8]

generic programming facilities: https://github.com/golang/go/issues/15292,

[9]

Why Generics: https://blog.golang.org/why-generics#TOC_1.,

[10]

generics-next-step: https://blog.golang.org/generics-next-step,

[11]

泛型 官方 proposal: https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md,

[12]

omissions: https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md#omissions,

[13]

why-do-we-need-generics: https://xargin.com/why-do-we-need-generics/,


瀏覽 51
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 一本道视频在线| 大香蕉69| 国内精品久久久久久久| 99热国品| 一级a一级a爱片兔兔软件| 欧美在线播放| 午夜性视频| 日韩免费中文字幕| 五月丁香六月激情综合| 成人黄色在线观看视频| 91麻豆大奶巨乳一区白虎| 亚洲影院在线观看| 手机在线观看AV| 午夜性福利视频| 免费观看成人毛片A片直播千姿| 欧美伊人网在线观看| 成人国产精品| 婷婷久久亚洲| 一区二区无码精品| 午夜美女福利视频| 免费看黄色电影| 久久久久久久| 欧一美一婬一伦一区二区三区自慰| 九九热在线精品| 俄罗斯白嫩BBwBBwBBw91| 91人妻人人澡人人爽人人DVD | 簧片网站免费| 夜夜嗨av无码一区二区三区| 蜜桔视频嫩草蜜桃| 无码A片| 性无码一区二区三区无码免费 | 人妻无码一区二区三区免费| 四房婷婷| 日韩高清无码中文字幕| 亚洲国产色情| 免费播放婬乱男女婬视频国产| 欧美老女人操逼视频| 日本在线免费视频| av日韩在线播放| 九九久久影院| 在线看片a| 先锋影音av资源网| 青娱乐毛片| 亚洲爱| 一本一本久久a久久精品牛牛影视| 波多野结衣与黑人| 人妻免费在线视频| 国产潮吹| 丁香五月激情中文字幕| 波多野结衣无码视频| 91精品一区二区| 亚洲香蕉在线观看| 国产棈品久久久久久久久久九秃| 97超级碰| 五月丁香视频在线观看| 成人先锋影音| 午夜亚洲AⅤ无码高潮片苍井空| 大鸡吧大香蕉| 福利老湿69| a色视频| 国产精品黄色| 无码人妻丰满熟妇bbbb| 特级西西WWW888| 99精品人妻| 亚洲欧美激情小说| 草逼国产| caopeng97| 香蕉视频一区| 懂色AV一区二区三区国产中文在线 | 亚洲视频网址| 欧美久久一区二区三区四区视频| 人妻无码中文久久久久专区| 三级丁香在线| 羞羞色院91蜜桃| 亚洲无码免费在线观看| 日韩欧美国产高清91| 激情婷婷丁香| 中文字幕h| 操小骚逼视频| 国产日韩欧美综合在线| 免费色网站| 欧美成人性爱图片| 天天看片天天爽| av在线资源播放| 日韩免费AV电影| 老司机精品| 天天舔天天操| 亚洲精品成人网站| AV资源在线免费观看| 西西人体444www| 北条麻妃无码视频在线| 不卡AV在线播放| 久久久偷拍| 日韩无码免费播放| 国产伊人久久| 一本道高清| 日韩高清av| 欧美熟妇性爱| 国产淫语| 久久99老妇伦国产熟女| 人人操大香蕉| 久久国产精品网站| 先锋影音资源av| 精品一区二区视频| 中日韩一级片| 日韩成人影片| 天天插天天干| 亚洲AV无码成人精品| 蜜桃视频一区| 山东熟妇搡BBBB搡BBBB| 久久青青| 色婷婷五月天| 2016av天堂网| 岛国A视频| 国产精品久久久91| 国产寡妇亲子伦一区二区三区四区| 国产骚逼视频| 欧美一级AAA大片免费观看| v天堂在线观看| 久热在线资源福利站| 亚洲欧美高清视频| 在线成年人视频| 精品日韩AV| 欧美AAAAAAAAAA特级| 人妻18无码人伦一区二区三区精品| 国产又爽又黄网站免费观看| 牛牛在线精品视频| 在线视频你懂| 特黄AAAAAAAAA真人毛片| 91成人在线电影| 欧美另类综合| 插菊花综合网站| 欧美精品人妻| 亚洲小说区图片区| 先锋影音资源av| 成人在线免费视频观看| 成人777| 天天干夜夜爽| 成人AV在线电影| 黄片高清免费观看| 蜜乳AV一区二区三区| 日本亚洲视频| 日本一级特级毛片视频| 久久夜夜操| 欧美操b视频| 精品孕妇孕交无码专区| 91亚洲国产AⅤ精品一区二区 | 麻豆国产精品一区| 91最新地址| 黄片aaa| 欧美性爱a视频| 日本親子亂子倫XXXX50路| 亚洲一本在线电影av| 国产又爽又黄免费网站在线看| 亚洲三级黄片| 国产无套在线观看| 足浴店少妇69XXX| 一级午夜福利| 粉嫩99精品99久久久久久特污兔 | 成人视频无码| 人妻av无码| 少妇AAA级久久久无码精品片| 国产免费无码一区二区| 人妻乱码| 少妇A片| 91新婚人妻偷拍| 影音先锋成人在线| 欧美精品91| 另类TS人妖一区二区三区| 2025av中文字幕| 香蕉毛片| 99福利视频| 美女做爱视频网站| 午夜成人免费福利| 精品无套| www.大鸡巴| 国产成人精品123区免费视频| 中文字幕牛牛婷婷| 91精品国产亚洲| 日韩午夜欧美精品一二三区| 午夜成人精品视频| 大香蕉欧美在线| 日韩欧美在线免费| 日韩视频成人| 初学影院WWWBD英语完整版在线观看| 夜夜狠狠躁日日躁| 天天射天天射| 影音先锋男人资源网| 亚洲操逼AV| 一区二区三区视屏| 中文字幕在线观看第一页| 偷拍第一页| 亚洲国产成人91PORN| 久久国产免费视频| 人人av在线| 在线观看日韩三级片av| 日韩在线中文| 日韩乱伦电影| 激情黄色视频| 亚洲天堂视频在线观看免费| 天天日日干| 五月丁香中文| 91美女在线观看| 2015中文字幕黄色视频| 国产黄色免费| 日本久久电影| 亚洲秘无码一区二区三区,| 日本高清无码在线观看| 日逼网站视频| 蜜桃久久久亚洲| 蜜桃传媒AV| 亚洲午夜无码精品专区| 亚洲AVwww| 先锋AV资源| 亚洲无码电影网| 一区二区三区四区无码视频| 中文字幕AⅤ在线| 伊人无码在线| 日本操逼片| 操逼操逼视频| 天天日天天操天天摸天天干天日射天天插 | 久99久热| 精品久久一区| 一级Aa视频免费看| 国产第页| 亚欧洲精品视频| 国产视频一区二区三区四区| 久久青| 免费成人黄片| 亚洲日韩Av无码中文字幕美国| 中文字幕一区二区三区四区五区六区| 内射欧美| 亚洲人成色777777无码| 自拍偷拍15p| 国产无套进入免费| 国产亚洲色婷婷久久99精品| 超碰福利导航| 天天天天日天天干| 天天日天天色天天干| 99在线精品视频观看| 黄色视频大全在线观看| 韩国成人免费无码免费视频| 国产日韩91| 国产在线你懂得| 日本親子亂子倫XXXX| 久久久久久无码精品亚洲日韩麻豆| 人人澡人人妻人人爽| 影音先锋AV成人| 午夜AV福利影院| 日本少妇中文字幕| 激情五月天亚洲| 国产精品久久7777777精品无码 | 日韩精品人妻一区二区| 国产成人一区二区三区| 亚洲69| 99热国产在线| 黄片网站免费观看| 人妻无码视频| 伊人在综合| 大帝AV| 777偷窥盗摄00000| 一区二区国产视频| 国产精品一区av| 首屈一指视频在线观看| 黑人AV在线观看| yw在线播放| 在线观看亚洲一区| 欧美sesese| 特级A级毛片| 五月丁香婷婷色| 97超碰人人操| 国产福利AV| 麻豆性爱| 一本一道久久a久久精品综合| 青草视频精品| 国产乱码一区二区三区| 精品久热| 久久婷婷成人综合色怡春院| 最新无码在线| 亚洲AV无码成人精品区| 欧美操逼图片| 婷婷五月天AV| 91探花秘在线播放| 波多野结衣vs黑人巨大| 毛片9| 啪啪视频在线观看| 丝袜毛片| 99久久99九九九99九他书对| 特黄aaaaaaaa真人毛片| 无码熟妇| 免费国产h| 成年视频在线观看| 免费国产成人看片在线| 亚洲日韩视频在线播放| 免费无码国产| 亚洲精品视频在线播放| 大香蕉A片| 人妻性爱| 日韩一区二区三区四区久久久精品有吗 | 久久AV网站| 一区二区无码高清| 亚洲免费中文字幕| 国产成人精品AV| 婷婷天天干| 天天日天天日天天操| 一级黄色免费片| 爱逼av| 久久99综合| 国产亲子乱婬一级A片| 永久免费看A人片无码精| 欧美国产日韩视频| 免费无码在线视频| а天堂中文在线资源| 91在线无码| 日产久久久| 成人大香蕉视频| 国产传媒_色哟哟| 国产免费成人视频| 男女操逼视频网站免费观看| 欧美熟妇另类久久久久久不卡 | 星空AV| 中文字幕日本无码| 五月婷婷丁香综合| 一线天嫩穴少妇| 久久国产偷拍| 午夜福利澳| 丁香在线视频| 亚洲中文在线观看| 996热re视频精品视频这里| 欧美婬乱片A片AAA毛片地址| 欧美成人三区性价比| 国产一级视频| 亚洲精品无码中文| 日韩欧美第一页| 豆花成人社区,视频| 欧美婷婷五月| 日韩精品无码电影| 狼友在线观看| 性欧美成人播放77777| 成人激情视频A极| 自慰一区| 成人丁香五月天| 婷婷丁香五月社区亚洲| 91免费在线| jizz免费观看| 精品亚洲无码视频| 天天操综合网| 97色情| 亚洲天堂精品视频| 男女av| 国产精品伊人| 丁香五月综合网| 亚洲精品乱码久久久久| 欧美第一视频| 日本三级中文字幕| 影音先锋成人电影| 黄色片网站视频| 男人天堂视频在线观看| 国产操| 亚洲婷婷AV| 性无码一区二区三区无码免费| 小佟丽娅大战91哥| www.豆花福利视频| 狠狠干2018| 欧美爱爱免费看| 国产女人18水真多18精品一级做 | 九九天堂网| 日韩精品久久久| a无码| 影音先锋AV无码| 国产娇小13videos糟蹋| 三级免费无限AV| 国产精品一色哟哟哟| 亚洲视频综合| 超碰在线播| 国产丨熟女丨国产熟女视频| 成人自拍偷拍视频| 人人人干| 一区二区三区四区五区| 免费一级a片| 台湾省成人网站| 蜜桃导航-精品导航| 亚洲AV免费电影| 91日韩在线| 亚洲免费看黄| 久草福利在线观看| 日本中文字幕在线| 97人人操人人| 大香蕉男人天堂| 91性爱小视频| 日本人妻在线视频| 国产一区二区三区视频| 无码9999| 手机av在线| 精品久久无码| 夜夜操免费视频| 精品热99| 无码一区在线观看| 成人精品秘久久久按摩下载| 97资源超碰| 制服丝袜一区| 中文天堂| 久久久久久无码精品亚洲日韩麻豆| 日韩日批视频| 亚洲无码乱码av| 黄片无遮挡| 欧美黄色毛片| 操B视频在线免费观看| 中文字幕av高清片,中文在线观看| 中文字幕日韩高清| 国产一级片内射| 99热亚洲| 91超碰久久在线| 97人妻人人澡人人| 五月天婷婷视频| 免费成人一级片| 91成人视频在线观看| 一本之道高清数码大全| 少妇福利| 国产女人18水真多18精品| 91免费小视频| 欧美A级成人婬片免费看| 国产成人片| 亚洲无码www| 一级真人毛片| 伊人丁香| 蜜臀AV成人精品| 国产精品美女久久久久久久久 | 乱伦视频91| 一区视频| 欧美A片在线| 婷婷六区| 江苏妇搡BBB搡BBBB| 91麻豆国产在线观看| 欧美级毛片一进一出夜本色| 成人乱码一区二区三区| 五月婷婷亚洲| 成人午夜无码| 亚洲福利影院| 亚洲日韩欧美视频| 1024手机在线观看| 久久xx| 日韩性爱在线视频| 欧美黄色网| 精品超碰| 日韩无码一卡| 操操影院| 91欧美精品成人AAA片| 国产黄片免费在线观看| 中文字幕国产综合| 日本黄色免费看| 国产在线一| AV女优天堂| 亚洲欧美视频在线观看| 三级片网站在线观看| 操B视频在线| 日韩无码激情| 一区二区三区无码专区| 欧美老熟妇乱大交XXXXX| 影音先锋色色| 天天拍夜夜操| 精品伊人久久| 白浆在线| 可以在线观看的AV| 中午字幕在线观看| 无码精品人妻一区二区三刘亦菲 | 麻豆成人无码精品视频| 亚洲丰满熟妇| 看操b视频| 日日干天天射| 96久久| 久操免费在线| 欧美丰满少妇人妻精品| 国产精品偷拍视频| 成人性爱在线观看| 欧美亚洲综合在线| 亚洲日韩在线a成| 一区二区高清无码| 欧美插逼视频| 日韩美在线| 91视频在线观看网| 欧美理论片在线观看| 日日搔AV一区二区三区| 中文大香蕉视频| 午夜在线视频| 午夜福利爱爱视频| 亚洲欧美日本在线| 国产一级一片免费播放放a| 五月丁香免费视频| 国产人妻AV| 无码精品一区二区三区在线播放 | 91吴梦梦无码一区二区| 风情万种AV| 男插女青青影院| 大香蕉大香蕉网| 懂色一区二区二区在线播放视频| 91在线无码| 中文字幕你懂的| 西欧超碰在线| 91性爱小视频| 免费看黃色AAAAAA片| 亚洲电影AV| 一级片在线免费看| 男女嫩草视频| 无码福利电影| 大地影视中文第三页最新在线观看 | 国产黄A| 三级毛片在线| 亚洲色婷婷久久精品AV蜜桃| 91精品久久久久久| 美日韩在线观看| 黑人巨大翔田千里AⅤ| 免费av毛片| 99欧美| 琪琪色在线视频| 日韩精品在线视频观看| 五月婷婷黄色| 51福利视频| 亚洲乱伦中文字幕| 99精品国自产在线| 欧美特黄AAAAAA| 伊人黄片| 操欧美老女人| 欧美亚洲自拍偷拍| 久久久久亚洲AV无码专区| 天天想天天干| 大香蕉操逼| 成人免费看片| 亚洲无码专区视频| 午夜一本道| 成人国产精品秘在线看| 狼友在线观看| 日韩人妻码一区二区三区| 91成人区| 91色色网| 四虎精品一区二区三区| www.6969成人片亚洲| 呦小性Free小U女HD| 亚洲精品乱码在线| 婷婷五月天激情俺来也| 欧美a在线观看| 中文字幕aV在线| 国产乱叫456在线| 成人网一区二区| 人成视频在线观看| 国产操操操| 熟女少妇视频| www.毛片| 狠狠躁婷婷天天爽综合| 操逼视频大全| 综合夜夜| AV无码免费一区二区三区不卡| 91aV视频| 国产成人精品亚洲男人的天堂| 亚洲成人影片| 欧美另类激情| 国产插穴| 精品国产久久久久久| 五月丁香中文| 西西www444无码免费视频| 天堂视频在线| 日韩欧美成人在线| 欧美黄色成人网站| 加勒比人妻| 精精国产| 操日视频| 91内射| 欧美在线黄色| 激情视频国产| 欧美亚洲成人网| 超碰欧美在线| 熟女影音先锋| 99久久婷婷国产综合精品青牛牛| 奇米影视亚洲春色| 在线永久看片免费的视频| www男人天堂| 欧美人妻无码| 丁香AV| 男女视频网站在线观看| 波多野吉衣视频| 五月天操逼网| 91人妻人人操人人爽| 国产玖玖| 思思热思思操| 怡春院在线视频| 国产精品嫩草久久久久yw193 | 五月婷亚洲精品AV天堂| 自拍偷拍影音先锋| 俺也来最新色视频| 婷婷亚洲五月色综合| 丁香五月天婷婷久久| 日韩性爱视频| 久久不卡| 中文字幕在线网站| 草逼电影| 青青草手机在线观看| 特黄AAAAAAAA片免费直播| 中国精品77777777| 日本少妇高潮喷水XXXXXXX| 国产绿奴09-01| 91乱伦| 国产精品9| 操欧美逼| 亚洲国产色情| 久久无码高清| 欧美后门菊门交3p| 婷婷午夜精品久久久久久| 国产成人精品久久二区二区91 | 成人网| 免费观看黄色电影| 毛片中文字幕| 久久公开视频| 中文字幕亚洲天堂| 国产精品v欧美精品v日韩精品 | 蝌蚪窝在线免费观看视频| 久久一级片| 一本色道久久加勒比精品| 欧美日韩精品久久久免费观看| www天天干| 亚洲成人久久久| 天堂资源中文在线| 九九热视频在线观看| 国产成人无码一区二区在线观看| 香蕉在线观看| 精品无人区无码乱码毛片国产| 中文字幕精品久久久久人妻红杏Ⅰ | 少妇做爱视频| 538在线视频| 久久99久久99久久99国内少妇精品 | 波多野结衣视频网站| 中文字幕第一区| 人妻无码一区二区三区摄像头| 91天堂网| 天天爽夜夜爽人人爽| 中文字幕永久在线观看| 可以免费观看的av| 粉嫩护士小泬18p| 欧美老妇操逼视频| 俺来俺去www色官网| 精东av| 一区二区三区www污污污网站| 水蜜桃视频在线播放| 国产91嫩草乱婬A片2蜜臀| 中文字幕无吗| 国产成人午夜福利视频| 久久久国产一区二区三区| 91视频成人版一区二区| 日本成人不卡视频| 日韩无码第一页| www.日韩| 五月丁香在线| 亚洲AV无码乱码| 99爱视频| 日韩小视频| 久草中文在线| 亚洲精品乱码久久久久| 欧美卡一卡二| 黄色视频在线观看网站| 黄视频免费在线观看| 国产精品成人AV在线| 中文字幕第五页| 99re视频在线| 超碰成人福利| 欧美性爱中文字幕| 伊人99| 国产亚洲色婷婷久久99精品91| 欧美一级日韩一级| 国产在线观看免费视频| 亚洲高清在线视频| 在线视频中文字幕| 五月av| 午夜精品视频| 国产AV资源| 柠檬福利第一导航| 国产麻豆AⅤMDMD0071| 逼逼AV网站-日韩电影| 三级AV在线免费观看| 亚洲欧美熟妇久久久久久久久| 国产精品9999久久久久仙踪林| 黑人vs亚洲人在线播放| 日本最新免费二区| 大地8免费高清视频观看大全 | 欧美粗大| 亚洲ww国产a大作| 91免费网站在线观看| 国产91无码| 在线观看www视频| 国产午夜成人免费看片无遮挡| 黄视频免费| 国产成人免费视频在线| 亚洲日韩AV无码| 三级片网站视频| 六月丁香视频| 在线中文无码| 麻豆91精品人妻成人无码| 亚洲69| 成人一级A片| 中文无码在线| 狠狠躁夜夜躁人人爽人妻| 偷偷操av| 亚洲情在线| 艹逼视频免费观看| 天天干,天天日| 四虎综合网| 国产女人高潮毛片| 曰曰摸日日碰| 超碰人人在线观看| 亚洲乱码日产精品BD在线观看 | 青春草在线观看| 神马午夜精品95| 日日干日日操| 亚洲无码精品视频| 色第一页| 在线观看成人三级片| 日本黄色大全| 北条麻妃亚洲无码| 国产做爰XXXⅩ久久久骚妇| 九一av| 日韩综合在线视频| а√最新版在线中文8| 中文字幕人妻互换av久久| 陈冠希和张柏芝mv| 无码精品ThePorn| 久久狠| 最新av资源| 很很撸在线视频| 中文字幕乱码中文乱码图片| 这里只有精品视频在线| 欧美AAA在线观看| 91久久爱| 麻豆国产精品一区| 日韩A级毛片| 樱桃av| 88海外华人免费一区| 韩国一区二区三区在线观看| 天天色人人| 色婷婷一二三精品A片| 九九精品在线视频| 青草国产视频| 亚洲一区AV| 九色91| 人人摸人人干| 青草网在线观看| 二级黄色视频| 人人干人人妻| 成人精品一区二区区别解析| 婷婷综合五月天| 国产乱伦网| 91麻豆精品成人一区二区| 中国免费视频高清观看| 免费高清无码在线| 97pao| 国产v在线观看| 精品人妻午夜一区二区三区四区 | 日韩三级AV在线观看| 亚洲成人福利电影| 国产又爽又黄视频| 91在线无码精品在线看| 日韩熟妇无码中文字慕| 黑人无码AV黑人天堂无码AV| 大香蕉中文| 久久午夜无码鲁片午夜精品男男 | 美女做爱视频网站| 亚洲av图片| 人人操碰| 欧美成人高清| 91蝌蚪久久| 黄色成年人视频在线观看| 无码视频中文字幕| 日韩精品在线观看免费| 91久久国产综合久| 免费黄色在线视频| 久久中文字幕免费| 免看一级a一片| 插插插综合| 天天色影院| 安徽妇搡BBB搡BBBB户外老太太| 大香蕉啪啪| 日韩性爱视频在线播放| 人人爽人人爽人人| 小明看台湾成人永久免费视频网站| 成人无码交配视频国产网站| 伊人久久久| 亚洲一区中文字幕成人在线| 亚洲一区黄色| 丰滿人妻-区二区三区| 久色精品| 欧美操逼图片| 懂色中国闺密偷情懂色AV| 欧美天天性| 成人伊人综合网| 深爱五月激情| 日韩高清无码中文字幕| 四虎2025在线51| 国产香蕉AV| 欧美成人高清无码| 99精品无码| 91人妻成人精品一区二区| 性饥渴欧美老妇XXXXX| 中文资源在线观看| 亚洲欧美成人在线观看| 国产h视频在线观看| 在线免费黄片| 8090操逼网| 成年人黄色视频网站| xxx日韩| 特级西西西西4444级酉西88wwww特| 国产一区二区00000视频| 日韩av在线看| 熟妇一区二区| 免费黄色视频大全| 一级操逼视频| 性性性性性XXXXX| 日B视频在线观看| 97人妻视频| 日韩中文字幕在线观看| 91香蕉视频在线看| 日韩美女免费视频| 亚洲清高毛无码毛片| 91乱子伦国产乱子伦无码| 山东乱子伦视频国产| 久久AV网站| 超碰97久久| 欧美日逼视频| 东京热av一区二区| 国产精品中文| 免费乱伦| 中文字幕一区三区三A片密月 | 自拍偷拍av| 国产精成人品| 亚洲色视频在线观看| 国产亚洲精品午夜福利巨大软件 | 四虎视频| 中文字幕高清无码在线播放| 国产无码观看| 日韩性爱视频在线观看| 久久久性爱| 黄色片网站视频| 亚洲天堂视频在线观看免费| 欧美黄色小视频| 少妇高潮av久久久久久| 91亚洲国产精品| 丝袜一区| 欧美狠狠干| 亚洲无码免费在线视频| 免费看黄在线看| 米奇色色| 91福利视频网| 男女av免费| 欧美中文字幕在线视频| 丁香五月激情中文字幕| 国产精品美女在线观看| www.色悠悠| 亚洲福利| 亚洲一区二区视频在线观看| 精品国产成人a在线观看| 亚洲高清无码在线| 蝌蚪窝免费在线视频| 欧美一级欧美三级在线观看| 午夜精品18视频国产17c| 国产成人无码区免费视频| 日韩欧美小电影| 性欧美| 天天玩夜夜玩天天玩国产99| 国产无码AV| 五月婷中文字幕| 精品无码一区二区三区| 久综合网| 超碰天天爱| 五月色婷婷撸| 国产精品国产三级国产| 毛片毛片毛片毛片毛片毛片| 亚洲九九| 国精产品一二三区| 爱搞视频在线播放| 久久草成人网| 久久大香蕉91| 日韩经典无码| 亚洲草片| 亚洲黄色Av| 亚洲欧美成人网| 五月亚洲六月婷婷| 影音先锋国产在线| 第一色影院| 东京亚洲无码| 成人网站三级片| 91无码人妻传媒tv| 蜜桃无码在线| 99ri国产| 日本不卡视频| 狠狠干2024| 欧美大屌视频| 天天爽夜夜爽精品成人免费| 日韩无码免费电影| 无码视频一区| 91新婚人妻偷拍| 国产精品揄拍500视频| 国产区在线观看| 激情五月天开心网| 一级A黄片|