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

什么? C 語言動態庫免費大放送了?

開發 前端
今天給大家看一個魔法, 這個魔法可以讓你非常方便的在 luajit 里面使用高性能的 C/CPP 庫, 從而避免自己造輪子的痛苦.

看到有同學說 Lua 庫少, 需要自己造輪子. 其實不是這樣的, 今天給大家看一個魔法, 這個魔法可以讓你非常方便的在 luajit 里面使用高性能的 C/CPP 庫, 從而避免自己造輪子的痛苦.

[[360633]]

這個魔法是 FFI ( Foreign function interface ), 我并不打算仔細講 FFI 原理, 所以簡單來說, FFI 實現了跨語言的二進制接口. 它的優點是高效方便. 直接調用 ABI, 缺點也很明顯, 出了問題直接會掛掉, 因此數據跨臨界區前仔細檢查就可以了.

我們今天直接找個 C 語言庫, 然后利用 FFI 在 luajit 里面調用這個函數庫作為個大家的演示.

什么? 這里竟然躺著一個高性能 base64 庫?

我們以這個 repo 為例: https:// github.com/aklomp/base6 4 . 這是一個 C 編寫的 Base64 編碼/解碼庫, 而且支持SIMD.

可以簡單運行下這個庫的 benchmark:

  1. karminski@router02:/data/works/base64$ make clean && SSSE3_CFLAGS=-mssse3 AVX2_CFLAGS=-mavx2 make && make -C test 
  2. ... 
  3. Testing with buffer size 100 KB, fastest of 10 * 100 
  4. AVX2    encode  12718.47 MB/sec 
  5. AVX2    decode  14542.81 MB/sec 
  6. plain   encode  3657.40 MB/sec 
  7. plain   decode  3433.23 MB/sec 
  8. SSSE3   encode  7269.55 MB/sec 
  9. SSSE3   decode  8173.10 MB/sec 
  10. ... 

我的 CPU 是 Intel(R) Xeon(R) CPU E3-1246 v3 @ 3.50GHz, 可以看到CPU如果支持 AVX2 的話, 可以達到 12GB/s 以上, 這個性能非常強悍, 甚至連普通的SSD都跟不上了.

我們需要的第一步是把這個 repo 編譯為動態庫. 但是這個 repo 并沒有提供動態庫的編譯選項, 所以我們魔改下這個項目的 Makefile.

  1. CFLAGS += -std=c99 -O3 -Wall -Wextra -pedantic 
  2.  
  3. # Set OBJCOPY if not defined by environment: 
  4. OBJCOPY ?= objcopy 
  5.  
  6. OBJS = \ 
  7.   lib/arch/avx2/codec.o \ 
  8.   lib/arch/generic/codec.o \ 
  9.   lib/arch/neon32/codec.o \ 
  10.   lib/arch/neon64/codec.o \ 
  11.   lib/arch/ssse3/codec.o \ 
  12.   lib/arch/sse41/codec.o \ 
  13.   lib/arch/sse42/codec.o \ 
  14.   lib/arch/avx/codec.o \ 
  15.   lib/lib.o \ 
  16.   lib/codec_choose.o \ 
  17.   lib/tables/tables.o 
  18.  
  19. SOOBJS = \ 
  20.   lib/arch/avx2/codec.so \ 
  21.   lib/arch/generic/codec.so \ 
  22.   lib/arch/neon32/codec.so \ 
  23.   lib/arch/neon64/codec.so \ 
  24.   lib/arch/ssse3/codec.so \ 
  25.   lib/arch/sse41/codec.so \ 
  26.   lib/arch/sse42/codec.so \ 
  27.   lib/arch/avx/codec.so \ 
  28.   lib/lib.so \ 
  29.   lib/codec_choose.so \ 
  30.   lib/tables/tables.so 
  31.  
  32. HAVE_AVX2   = 0 
  33. HAVE_NEON32 = 0 
  34. HAVE_NEON64 = 0 
  35. HAVE_SSSE3  = 0 
  36. HAVE_SSE41  = 0 
  37. HAVE_SSE42  = 0 
  38. HAVE_AVX    = 0 
  39.  
  40. # The user should supply compiler flags for the codecs they want to build. 
  41. # Check which codecs we're going to include: 
  42. ifdef AVX2_CFLAGS 
  43.   HAVE_AVX2 = 1 
  44. endif 
  45. ifdef NEON32_CFLAGS 
  46.   HAVE_NEON32 = 1 
  47. endif 
  48. ifdef NEON64_CFLAGS 
  49.   HAVE_NEON64 = 1 
  50. endif 
  51. ifdef SSSE3_CFLAGS 
  52.   HAVE_SSSE3 = 1 
  53. endif 
  54. ifdef SSE41_CFLAGS 
  55.   HAVE_SSE41 = 1 
  56. endif 
  57. ifdef SSE42_CFLAGS 
  58.   HAVE_SSE42 = 1 
  59. endif 
  60. ifdef AVX_CFLAGS 
  61.   HAVE_AVX = 1 
  62. endif 
  63. ifdef OPENMP 
  64.   CFLAGS += -fopenmp 
  65. endif 
  66.  
  67.  
  68. .PHONY: all analyze clean 
  69.  
  70. all: bin/base64 lib/libbase64.o lib/libbase64.so 
  71.  
  72. bin/base64: bin/base64.o lib/libbase64.o lib/libbase64.so 
  73.     $(CC) $(CFLAGS) -o $@ $^ 
  74.  
  75. lib/libbase64.o: $(OBJS) 
  76.     $(LD) -r -o $@ $^ 
  77.     $(OBJCOPY) --keep-global-symbols=lib/exports.txt $@ 
  78.  
  79. lib/libbase64.so: $(SOOBJS) 
  80.     $(LD) -shared -fPIC -o $@ $^ 
  81.     $(OBJCOPY) --keep-global-symbols=lib/exports.txt $@ 
  82.  
  83. lib/config.h: 
  84.     @echo "#define HAVE_AVX2   $(HAVE_AVX2)"    > $@ 
  85.     @echo "#define HAVE_NEON32 $(HAVE_NEON32)" >> $@ 
  86.     @echo "#define HAVE_NEON64 $(HAVE_NEON64)" >> $@ 
  87.     @echo "#define HAVE_SSSE3  $(HAVE_SSSE3)"  >> $@ 
  88.     @echo "#define HAVE_SSE41  $(HAVE_SSE41)"  >> $@ 
  89.     @echo "#define HAVE_SSE42  $(HAVE_SSE42)"  >> $@ 
  90.     @echo "#define HAVE_AVX    $(HAVE_AVX)"    >> $@ 
  91.  
  92. $(OBJS): lib/config.h 
  93.  
  94. $(SOOBJS): lib/config.h 
  95.  
  96. # o 
  97. lib/arch/avx2/codec.o:   CFLAGS += $(AVX2_CFLAGS) 
  98. lib/arch/neon32/codec.o: CFLAGS += $(NEON32_CFLAGS) 
  99. lib/arch/neon64/codec.o: CFLAGS += $(NEON64_CFLAGS) 
  100. lib/arch/ssse3/codec.o:  CFLAGS += $(SSSE3_CFLAGS) 
  101. lib/arch/sse41/codec.o:  CFLAGS += $(SSE41_CFLAGS) 
  102. lib/arch/sse42/codec.o:  CFLAGS += $(SSE42_CFLAGS) 
  103. lib/arch/avx/codec.o:    CFLAGS += $(AVX_CFLAGS) 
  104. # so 
  105. lib/arch/avx2/codec.so:   CFLAGS += $(AVX2_CFLAGS) 
  106. lib/arch/neon32/codec.so: CFLAGS += $(NEON32_CFLAGS) 
  107. lib/arch/neon64/codec.so: CFLAGS += $(NEON64_CFLAGS) 
  108. lib/arch/ssse3/codec.so:  CFLAGS += $(SSSE3_CFLAGS) 
  109. lib/arch/sse41/codec.so:  CFLAGS += $(SSE41_CFLAGS) 
  110. lib/arch/sse42/codec.so:  CFLAGS += $(SSE42_CFLAGS) 
  111. lib/arch/avx/codec.so:    CFLAGS += $(AVX_CFLAGS) 
  112.  
  113. %.o: %.c 
  114.     $(CC) $(CFLAGS) -o $@ -c $< 
  115.  
  116. %.so: %.c 
  117.     $(CC) $(CFLAGS) -shared -fPIC -o $@ -c $< 
  118.  
  119. analyze: clean 
  120.     scan-build --use-analyzer=`which clang` --status-bugs make 
  121.  
  122. clean: 
  123.     rm -f bin/base64 bin/base64.o lib/libbase64.o lib/libbase64.so lib/config.h $(OBJS) 

看不懂沒關系, Makefile 是如此的復雜, 我也看不懂, 僅僅是憑著感覺修改的, 然后他就恰好能運行了... 注意 Makefile 的縮進一定要用 "\t", 否則不符合語法會報錯.

然后我們進行編譯:

  1. AVX2_CFLAGS=-mavx2 SSSE3_CFLAGS=-mssse3 SSE41_CFLAGS=-msse4.1 SSE42_CFLAGS=-msse4.2 AVX_CFLAGS=-mavx make lib/libbase64.so 

這樣我們就得到了libbase64.so 動態庫 (在 lib 里面). 這里還順便開啟了各種 SIMD 選項. 如果不需要的話可以關閉.

魔改開始

當然這只是魔法, 不是煉金術, 所以是需要付出努力的, 我們要手動實現動態庫的橋接, 首先我們需要查看我們要調用的函數需要什么參數. 這兩個定義很簡單, 我們需要傳入:

  1. const char *src 
  2. size_t srclen 
  3. char *out 
  4. size_t *outlen 
  5. int flags 
  1. void base64_encode(const char *src, size_t srclen, char *out, size_t *outlen, int flags); 
  2. int  base64_decode(const char *src, size_t srclen, char *out, size_t *outlen, int flags); 

然后我們就可以開始編寫 ffi 橋接程序了. 首先把需要的庫全都包含進來, 注意, 多用 local 沒壞處, 使用 local 可以有效從局部查詢, 避免低效的全局查詢. 甚至其他包中的函數都可以 local 一下來提升性能.

動態庫的話用專用的 ffi.load 來引用.

然后定義一個 _M 用來包裹我們的庫. 這里跟 JavaScript 很像, JavaScript 在瀏覽器里有 window, Lua 有 _G. 我們要盡可能避免封裝好的庫直接扔給全局, 因此封裝起來是個好辦法.

  1. -- init 
  2. local ffi        = require "ffi" 
  3. local floor      = math.floor 
  4. local ffi_new    = ffi.new 
  5. local ffi_str    = ffi.string 
  6. local ffi_typeof = ffi.typeof 
  7. local C          = ffi.C 
  8. local libbase64  = ffi.load("./libbase64.so") -- change this path when needed. 
  9.  
  10. local _M = { _VERSION = '0.0.1' } 

然后是用 ffi.cdef 聲明 ABI 接口, 這里更簡單, 直接把源代碼的頭文件中的函數聲明拷過來就完事了:

  1. -- cdef 
  2. ffi.cdef[[ 
  3. void base64_encode(const uint8_t *src, size_t srclen, uint8_t *out, size_t *outlen, size_t flags); 
  4. int  base64_decode(const uint8_t *src, size_t srclen, uint8_t *out, size_t *outlen, size_t flags); 
  5. ]] 

接下來是最重要的類型轉換:

  1. -- define types 
  2. local uint8t    = ffi_typeof("uint8_t[?]") -- uint8_t * 
  3. local psizet    = ffi_typeof("size_t[1]")  -- size_t * 
  4.  
  5. -- package function 
  6. function _M.base64_encode(src, flags) 
  7.     local dlen   = floor((#src * 8 + 4) / 6
  8.     local out    = ffi_new(uint8t, dlen) 
  9.     local outlen = ffi_new(psizet, 1
  10.     libbase64.base64_encode(src, #src, out, outlen, flags) 
  11.     return ffi_str(out, outlen[0]) 
  12.  
  13. end  
  14.  
  15. function _M.base64_decode(src, flags) 
  16.     local dlen   = floor((#src + 1) * 6 / 8
  17.     local out    = ffi_new(uint8t, dlen) 
  18.     local outlen = ffi_new(psizet, 1
  19.     libbase64.base64_decode(src, #src, out, outlen, flags) 
  20.     return ffi_str(out, outlen[0]) 
  21. end 

我們用 ffi_typeof 來定義需要映射的數據類型, 然后用 ffi_new 來將其實例化, 分配內存空間. 具體來講:

我們定義了2種數據類型, 其中, local uint8t = ffi_typeof("uint8_t[?]") 類型用來傳輸字符串, 后面的問號是給 local out = ffi_new(uint8t, dlen) 中的 ffi_new 函數準備的, 它的第二個參數可以指定實例化該數據類型時的長度. 這樣我們就得到了一個空的字符串數組, 用來裝 C 函數返回的結果. 這里的 dlen 計算出了源字符串 base64 encode 之后的長度, 分配該長度即可.

同樣, local psizet = ffi_typeof("size_t[1]") 指定了一個 size_t * 類型. C 語言里面數組就是指針, 即 size_t[0] 與 site_t* 是等價的. 因此我們分只有一個元素的 size_t 數組就得到了指向 size_t 類型的指針. 然后在 local outlen = ffi_new(psizet, 1) 的時候后面的參數寫的也是1, 不過這里寫什么已經無所謂了, 它只是不支持傳進去空, 所以我們相當于傳了個 placeholder.

在使用這個值的時候, 我們也是按照數組的模式去使用的: return ffi_str(out, outlen[0]) .

需要注意的是, 一定要將 require "ffi" 以及 ffi.load 放在代碼最底層, 否則會出現 table overflow 的情況.

最后, 這個文件是這樣子的:

  1. --[[ 
  2.   
  3.     ffi-base64.lua 
  4.      
  5.     @version    20201228:1 
  6.     @author     karminski <code.karminski@outlook.com> 
  7.  
  8. ]]-- 
  9.  
  10. -- init 
  11. local ffi        = require "ffi" 
  12. local floor      = math.floor 
  13. local ffi_new    = ffi.new 
  14. local ffi_str    = ffi.string 
  15. local ffi_typeof = ffi.typeof 
  16. local C          = ffi.C 
  17. local libbase64  = ffi.load("./libbase64.so") -- change this path when needed. 
  18.  
  19. local _M = { _VERSION = '0.0.1' } 
  20.  
  21.  
  22. -- cdef 
  23. ffi.cdef[[ 
  24. void base64_encode(const uint8_t *src, size_t srclen, uint8_t *out, size_t *outlen, size_t flags); 
  25. int  base64_decode(const uint8_t *src, size_t srclen, uint8_t *out, size_t *outlen, size_t flags); 
  26. ]] 
  27.  
  28. -- define types 
  29. local uint8t    = ffi_typeof("uint8_t[?]") -- uint8_t * 
  30. local psizet    = ffi_typeof("size_t[1]")  -- size_t * 
  31.  
  32. -- package function 
  33. function _M.base64_encode(src, flags) 
  34.     local dlen   = floor((#src * 8 + 4) / 6
  35.     local out    = ffi_new(uint8t, dlen) 
  36.     local outlen = ffi_new(psizet, 1
  37.     libbase64.base64_encode(src, #src, out, outlen, flags) 
  38.     return ffi_str(out, outlen[0]) 
  39.  
  40. end  
  41.  
  42. function _M.base64_decode(src, flags) 
  43.     local dlen   = floor((#src + 1) * 6 / 8
  44.     local out    = ffi_new(uint8t, dlen) 
  45.     local outlen = ffi_new(psizet, 1
  46.     libbase64.base64_decode(src, #src, out, outlen, flags) 
  47.     return ffi_str(out, outlen[0]) 
  48. end  
  49.  
  50. return _M 

好了, 大功告成, 我們寫個 demo 調用一下試試:

  1. -- main.lua 
  2. local ffi_base64 = require "ffi-base64"  
  3.  
  4. local target = "https://example.com" 
  5.  
  6. local r = ffi_base64.base64_encode(target, 0
  7. print("base64 encode result: \n"..r) 
  8.  
  9. local r = ffi_base64.base64_decode(r, 0
  10. print("base64 decode result: \n"..r) 
  1. root@router02:/data/works/libbase64-ffi# luajit -v 
  2. LuaJIT 2.1.0-beta3 -- Copyright (C) 2005-2020 Mike Pall. https://luajit.org/ 
  3. root@router02:/data/works/libbase64-ffi# luajit ./main.lua  
  4. base64 encode result:  
  5. aHR0cHM6Ly9leGFtcGxlLmNvbQ== 
  6. base64 decode result:  
  7. https://example.com 

搞定! 是不是很簡單? 類似的 FFI 庫還有很多, 各個語言也有不同程度的支持. 大家都可以嘗試一下.

最后, 當你遇到類似的問題的時候, 就可以回憶起來, 還有 FFI 這樣一件趁手的兵(魔)器(法)在你的武器庫里面.

責任編輯:張燕妮 來源: 知乎
相關推薦

2009-03-25 16:54:10

Linux軟件免費

2010-11-02 15:36:30

jQuery

2010-07-22 10:28:59

Web開發IDE

2018-10-25 12:01:37

機房搬遷要點

2020-10-29 10:43:24

網絡安全支付寶電子錢包

2012-05-10 10:55:03

CSS

2014-01-10 14:08:57

WLAN速度優化

2017-11-01 15:50:38

數據庫MySQL 8.0新特性

2016-11-11 19:51:35

2011-11-24 09:13:16

CSS

2021-05-11 10:30:34

數字化

2009-02-02 14:25:45

軟件 芮祥麟 SAP

2020-09-22 07:45:14

編碼語言網站博客

2012-01-09 16:43:13

點心通訊錄

2019-09-24 09:29:26

Python數據接口

2014-08-25 14:40:22

百加域名

2018-05-10 08:20:23

自然語言數據集數據

2016-10-20 16:19:51

云主機
點贊
收藏

51CTO技術棧公眾號

亚洲视频资源| 久久综合色88| 欧美黄色性视频| 日本网站免费在线观看| 欧美丰满熟妇bbbbbb| 天堂а√在线最新版中文在线| 日韩avvvv在线播放| 精品美女在线观看| 中文字幕精品在线播放| 国产99久久久久久免费看| 日本欧美高清| 一区二区国产盗摄色噜噜| 国产精品美女免费视频| 亚欧洲乱码视频| 国内老熟妇对白xxxxhd| 视频免费一区| 男人亚洲天堂| 99国产欧美另类久久久精品| 色婷婷综合成人| 久久人人爽人人爽人人av| 亚洲不卡在线视频| 国产主播性色av福利精品一区| 一色屋精品亚洲香蕉网站| 国产福利精品视频| 扒开jk护士狂揉免费| 亚洲欧美专区| 欧美色图片你懂的| 亚洲一二三区精品| 96亚洲精品久久久蜜桃| 国产精品久久久久久麻豆一区软件 | 久久久国产成人精品| 久久精品日产第一区二区三区乱码 | 国产精品一区二区三| 精品国产成人亚洲午夜福利| gogo亚洲高清大胆美女人体| 国产清纯美女被跳蛋高潮一区二区久久w| 日本高清不卡的在线| 亚洲午夜久久久久久久久红桃| 桃色一区二区| 综合电影一区二区三区| 91精品国产品国语在线不卡| 国产精品电影网站| 伊人影院综合网| 97久久网站| 国产精品久久看| 91成人免费视频| 国偷自拍第113页| 国产探花在线精品| 亚洲美女色禁图| 一区二区三区**美女毛片| 天堂av一区二区| 国产精品人人妻人人爽| 国内精品久久久久久久影视蜜臀| 免费成人在线影院| 日韩视频在线你懂得| 国产玉足脚交久久欧美| 一二三四区在线观看| 凹凸成人精品亚洲精品密奴| 久久狠狠亚洲综合| 色综合天天综合网国产成人网| а天堂中文在线资源| 中文字幕一区二区三区四区久久 | 91成人抖音| 91国偷自产一区二区三区观看| 日本不卡二区| 99久久久久久久| 久久资源在线| 欧美另类极品videosbestfree| 中文在线一区二区三区| 四虎永久精品在线| 亚洲丰满少妇videoshd| 亚洲精品一区二区毛豆| 黑人乱码一区二区三区av| 日韩av电影免费观看高清完整版| 国产精品wwww| 男女激情免费视频| 丰满人妻妇伦又伦精品国产| 国产成人免费在线观看| 久久久久久亚洲精品中文字幕 | 国产精品视频一区二区三区| 国产不卡免费视频| 国产999视频| 国产午夜精品无码一区二区| 狠狠做六月爱婷婷综合aⅴ| 国产一区二区三区视频| 亚洲国产精品无码久久久久高潮| 奇米影视777在线欧美电影观看| 亚洲片av在线| 日本黄色录像片| 欧美日本三级| 欧美精品1区2区| 国产精品视频网站| mm131丰满少妇人体欣赏图| 欧美亚洲激情| 欧美巨乳在线观看| 手机看片久久久| 欧美无毛视频| 盗摄精品av一区二区三区| 国产精品777| 国产三级自拍视频| 26uuu亚洲| 国产精品自产拍高潮在线观看| 国内精品小视频| 日韩视频第二页| 福利小视频在线| ...xxx性欧美| 中文字幕在线成人| 国产精品免费观看久久| 99久久综合国产精品二区| 精品日韩一区二区| 一级黄色毛毛片| 二区三区在线观看| www.午夜av| 26uuu亚洲国产精品| 欧美日韩国产色| 视频一区二区中文字幕| 西野翔中文久久精品国产| a黄色在线观看| 师生出轨h灌满了1v1| 三年中文在线观看免费大全中国| 日本国产亚洲| 亚洲男人第一av网站| fc2成人免费视频| 91美女精品| 久久人人88| 亚洲欧美日韩久久久久久| 疯狂撞击丝袜人妻| 亚洲成人tv| 精品自在线视频| 伊人成人在线观看| 国模少妇一区二区三区 | 欧美1级2级| 亚洲精品美女在线观看播放| 成人h动漫精品一区| 最新亚洲精品| 中文字幕欧美日韩精品| 欧美变态tickling挠脚心| 黑人巨大精品欧美| 日韩图片一区| 欧美不卡视频一区| 国产一区二区三区久久精品| 欧美色图亚洲激情| 9色精品在线| 国产区欧美区日韩区| 国产日韩在线观看一区| 欧美激情在线一区二区三区| 久章草在线视频| 免费成人网www| 欧美做受高潮1| 免费在线观看一级毛片| 国产精品狼人久久影院观看方式| 91av俱乐部| 国产999精品在线观看| 尤物99国产成人精品视频| 尤物在线免费视频| 亚洲视频1区| 成人妇女免费播放久久久| 精品无码一区二区三区的天堂| 久操视频免费在线观看| 欧美男男freegayvideosroom| 久久国产精品影片| 女人十八岁毛片| 99视频精品在线| 国产日韩在线精品av| wwww.国产| 亚洲91网站| 亚洲视频视频在线| 一级黄色av片| 国产精品激情偷乱一区二区∴| 国产日韩欧美中文在线播放| 曰本女人与公拘交酡| 99国产精品久久久久久久| 国产日韩精品推荐| 正在播放日韩精品| 在线视频欧美性高潮| 亚洲国产一区二区在线| 成人性视频免费看| 日韩在线中文| 97精品在线观看| 国产女人爽到高潮a毛片| 欧美人与拘性视交免费看| 日韩电影精品| 亚洲黄色录像片| av电影一区二区三区| 精品国产一区二区三区2021| 国内精久久久久久久久久人| 国产三级在线免费观看| 国产电影一区二区三区| 91电影在线观看| 韩国黄色一级片| 男人的天堂成人在线| 成人中文字幕+乱码+中文字幕| 天堂v视频永久在线播放| 亚洲免费视频一区二区三区| 欧美电影《睫毛膏》| 国产在线高清精品| 日本免费一区二区六区| 欧美日韩一区中文字幕| 91嫩草丨国产丨精品| www亚洲一区| 中文字幕日韩久久| 新67194成人永久网站| 欧美性黄网官网| 久在线观看视频| 日韩欧美国产精品综合嫩v| 97免费资源站| 成人a在线观看高清电影| 久久久亚洲精选| 亚洲成av人片一区二区| 在线观看视频亚洲| 一级特黄色大片| 五月婷婷久久综合| 天天天天天天天天操| 国产亚洲制服色| 黄色片在线免费| 精品99在线| 国产精品美乳一区二区免费| 91色在线看| 日韩网站免费观看| 国产三级漂亮女教师| 狠狠色香婷婷久久亚洲精品| 欧美日韩精品在线观看视频 | 国产一区二区三区四区hd| 国产第一精品| 国产精品福利无圣光在线一区| heyzo高清国产精品| 欧美尺度大的性做爰视频| 2019中文字幕在线视频| 欧美人牲a欧美精品| 国产jizz18女人高潮| 久久亚洲欧美国产精品乐播| 成人免费xxxxx在线视频| 亚洲黄网站黄| 欧美日韩亚洲在线| 欧美男女视频| 国产精品久久久| 三上悠亚亚洲一区| 国产精品国产三级国产aⅴ无密码| 免费黄色福利视频| 日韩深夜福利| 亚洲h在线观看| 亚洲综合色在线观看| 日日摸夜夜添夜夜添精品视频| 日本一区网站| 加勒比成人在线| 免费不卡av| 国产视频亚洲视频| 亚洲性生活大片| 亚洲一区二区美女| 成人在线手机视频| 国产色91在线| 亚洲av成人无码久久精品| 精品一区二区在线免费观看| 欧洲精品国产| 精品国产一区一区二区三亚瑟 | 亚洲精品**不卡在线播he| 国产精品极品美女在线观看免费| 亚洲欧洲自拍| 国产成人激情小视频| 99只有精品| 亚洲mm色国产网站| 日韩福利一区| 国产精品久久久久久久app| yy6080久久伦理一区二区| 91精品国产综合久久香蕉的用户体验| 亚州精品国产| 丁香婷婷久久久综合精品国产 | 色婷婷综合久久久中文一区二区 | 欧美激情国产在线| av磁力番号网| 极品日韩av| 亚洲一区三区在线观看| 噜噜噜狠狠夜夜躁精品仙踪林| 国产精品传媒在线| 91在线无精精品白丝| 国产精品成人一区二区三区夜夜夜| 日韩精品高清视频| www.com亚洲| 欧美日韩不卡在线| www.色呦呦| 欧美日韩黄色一区二区| 国产三级在线观看视频| 亚洲国产精品久久91精品| av中文字幕第一页| 亚洲精品二三区| 亚洲AV无码乱码国产精品牛牛| 欧美三级日韩三级国产三级| 国产三级按摩推拿按摩| 亚洲精品狠狠操| 1769视频在线播放免费观看| 色综合色综合网色综合| 外国成人直播| 亚洲综合小说区| 国产欧美日韩视频在线| 精品视频9999| 国产情侣久久久久aⅴ免费| 成人短片线上看| 欧美日韩dvd| 911久久香蕉国产线看观看| 18禁裸男晨勃露j毛免费观看| 视频一区免费在线观看| 亚洲欧洲日韩综合| 中文字幕日本一区| 欧美一区二区播放| 成人无码一区二区三区| 亚洲系列中文字幕| 欧美家庭影院| 国产精品激情av电影在线观看 | 久久av老司机精品网站导航| 超级砰砰砰97免费观看最新一期 | 精品亚洲综合| 成人av在线播放网站| 中国特级黄色片| 国产欧美一区二区精品秋霞影院| 久久亚洲AV无码| 亚洲第一综合色| 在线观看中文字幕网站| 亚洲精品永久免费精品| 午夜在线激情影院| 欧美激情视频在线| 久久久久亚洲精品| 激情五月综合婷婷| 伊人狠狠色丁香综合尤物| 天天av综合| 黄色三级视频片| 99re66热这里只有精品3直播| 国产女人被狂躁到高潮小说| 欧美日韩一二三| 成年网站在线| 国产精品日韩在线观看| 精品日韩免费| 日本女优爱爱视频| 久久精品亚洲国产奇米99| 永久免费观看片现看| 欧美性猛交xxxx乱大交3| 天天干在线观看| 伊人青青综合网站| 性国裸体高清亚洲| 精品一区二区三区日本| 欧美色图在线播放| 日韩精品一区二区三区不卡| 麻豆国产欧美日韩综合精品二区 | 成人激情四射网| 欧美激情视频在线免费观看 欧美视频免费一 | 黄色网页在线播放| 国产经典欧美精品| 熟妇人妻久久中文字幕| 亚洲福利电影网| 无码精品视频一区二区三区| 亚洲天堂网站在线观看视频| 亚洲优女在线| 麻豆av福利av久久av| 亚洲不卡av不卡一区二区| 特黄视频免费观看| 97国产精品videossex| 日韩成人免费在线视频| 欧美日韩综合色| 大地资源网在线观看免费官网| 亚洲人亚洲人色久| 日韩avxxx| 国产无遮挡一区二区三区毛片日本| 日本久久综合网| 正在播放国产一区| av在线亚洲一区| 欧美极品少妇无套实战| 免费成人在线网站| 亚洲区一区二区三| 日韩精品一区在线| 三区四区在线视频| 91日本在线观看| 亚洲国产午夜| 天天躁日日躁aaaxxⅹ | 亚洲天堂网在线视频| 色噜噜久久综合伊人一本| 国产精品久久久久久久久久辛辛| www.男人天堂网| 国产日韩欧美激情| 国产草草影院ccyycom| 97涩涩爰在线观看亚洲| 精品视频免费| 永久看看免费大片| 日韩欧美在线字幕| 国产黄色在线播放| 99国产视频| 色爱综合网欧美| 在线观看网站黄| 日韩理论片一区二区| 99re国产在线| 欧美精品性视频| 宅男在线一区| 91在线第一页| 欧美日韩精品在线播放| 男女啪啪在线观看| 国产欧亚日韩视频| 红桃视频欧美| 黄色av片三级三级三级免费看| 精品电影一区二区| 久久香蕉一区| 日韩欧美亚洲精品| 成人黄色一级视频|