精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

深爱激情久久| 日本在线观看一区二区| 欧美视频在线第一页| 亚洲av永久无码精品| 成人免费在线观看| 国语一区二区三区| **性色生活片久久毛片| 4438全国亚洲精品在线观看视频| 中文字幕丰满乱码| 成人在线播放视频| 国产v综合v亚洲欧| 久久久久www| 黄色三级视频片| 视频一区二区在线播放| 亚洲电影成人| 精品国产露脸精彩对白| 伊人婷婷久久| 老熟妇一区二区三区啪啪| 亚洲调教一区| 日韩欧美在线观看| 黑人另类av| 青青操免费在线视频| 999久久久精品一区二区| 艳妇臀荡乳欲伦亚洲一区| 成人午夜一级二级三级| 91 在线视频| 精品176极品一区| 欧美激情自拍偷拍| 国产精品综合不卡av| 欧美丰满美乳xxⅹ高潮www| 永久免费毛片在线播放| 99视频有精品| 77777亚洲午夜久久多人| 欧美精品欧美极品欧美激情| 欧美aaaaa性bbbbb小妇| 97久久精品人人做人人爽| 77777亚洲午夜久久多人| 黄视频网站免费看| 日韩久久精品| 欧美群妇大交群中文字幕| 黄色一级片网址| 亚洲精品久久久久久久久久久久久久 | 精品国精品国产自在久国产应用| 黄色一区二区三区| 精品国产二区在线| 国产99对白在线播放| 黑丝一区二区三区| 日韩成人性视频| 三级a在线观看| 韩国中文字幕在线| 国产不卡视频一区二区三区| 成人亚洲欧美一区二区三区| 一级片在线观看视频| 羞羞色午夜精品一区二区三区| 欧美一区二区三区男人的天堂| www.av91| 黄色的视频在线免费观看| 美女脱光内衣内裤视频久久网站 | 操你啦视频在线| 成人午夜伦理影院| 欧美专区在线视频| 欧美成人久久久免费播放| 视频欧美精品| 午夜成人在线视频| 日韩久久不卡| wwwww在线观看免费视频| 国产欧美精品一区二区色综合朱莉| 美女被啪啪一区二区| 亚洲天堂中文网| 伊人天天综合| 性色av一区二区咪爱| 俄罗斯毛片基地| 成人h动漫免费观看网站| 精品成人免费观看| 亚洲观看黄色网| 嫩草一区二区三区| 在线视频欧美性高潮| 国产a级片视频| 性欧美18一19sex性欧美| 一区二区三区国产| 成人午夜精品久久久久久久蜜臀| 婷婷视频在线| 久久视频一区二区| 国产一区二区香蕉| 香蕉污视频在线观看| 亚洲欧洲日本mm| 久久在线免费视频| 免费一级黄色录像| 天天影视欧美综合在线观看| 亚洲午夜女主播在线直播| 潘金莲一级淫片aaaaa| 亚洲国产天堂| 精品国产123| 中文字幕av久久爽一区| 欧美国产另类| 久久精品免费电影| 国产在线一区视频| 午夜日本精品| 日本久久久久久久久| 国产精品19乱码一区二区三区| 亚洲永久免费| 69av在线视频| 国产精品久久久久久久久毛片| 天堂va蜜桃一区二区三区| 欧美精品福利在线| 免费三片在线播放| 牛牛国产精品| 日本欧美爱爱爱| 国产人妻精品一区二区三区| 久久99精品国产麻豆不卡| 国产成人av网| 青娱乐在线免费视频| 国产精品一区二区黑丝| 成人黄色网免费| 五月色婷婷综合| 波多野结衣中文字幕一区二区三区| 亚洲一区二区日本| www.国产黄色| 成人久久18免费网站麻豆| 奇米影视首页 狠狠色丁香婷婷久久综合 | 欧美亚一区二区三区| 高清一区二区三区| 色偷偷亚洲男人天堂| 国精产品一区一区| 国产精品久久久免费| 136fldh精品导航福利| 国产又粗又猛又黄| 久久久国产午夜精品| 天堂av一区二区| 香蕉视频在线播放| 狠狠躁夜夜躁人人躁婷婷91| 苍井空浴缸大战猛男120分钟| 在线免费av资源| 欧美tk—视频vk| 国产毛片毛片毛片毛片毛片毛片| 国产精品久久久久久久| 国产成人啪精品视频免费网| 香蕉国产在线视频| 亚洲国产综合色| 欧美v在线观看| jizz欧美| 欧美一区二区三区日韩视频| 林心如三级全黄裸体| 日韩激情一二三区| 91视频最新| 深夜福利在线观看直播| 97久久精品人人澡人人爽| 久久久久久久久久伊人| 国产精品99久久免费| 日韩欧美的一区| 亚洲熟妇无码av| 国产精品久久777777毛茸茸 | 亚洲欧美国产77777| 女人色极品影院| 老司机亚洲精品一区二区| 日韩电影在线观看中文字幕| 国产无套内射又大又猛又粗又爽| 国产精品一区免费在线观看| 蜜臀av性久久久久蜜臀av| 在线看的毛片| 国产亚洲欧洲黄色| 国产乡下妇女三片| 最新国产成人在线观看| 深爱五月综合网| 爽爽窝窝午夜精品一区二区| 日韩中文字幕免费看| 中文字幕日韩一级| wwww国产精品欧美| 7777在线视频| 黑人巨大精品| 亚洲精品一区二区在线观看| av资源吧首页| 久久久一区二区| 国产一伦一伦一伦| 欧美三级午夜理伦三级小说| 日韩在线观看成人| 国产wwwwwww| 午夜精品在线视频一区| 国产又粗又猛又爽视频| 亚洲日韩成人| 欧美一区二区视频17c| jizz欧美| 性欧美亚洲xxxx乳在线观看| 国产玉足榨精视频在线观看| 欧美精选午夜久久久乱码6080| 亚洲成人日韩在线| 狠狠噜噜久久| 欧美一区二区三区在线播放| 国产亚洲精aa在线看| 91精品国产91久久久| 97超碰人人在线| 欧美综合欧美视频| 亚洲一区二区乱码| 美国一区二区三区在线播放| 欧美精品123| 色网在线免费观看| 日韩在线视频一区| 人妻精品一区一区三区蜜桃91| 亚洲欧美欧美一区二区三区| av无码一区二区三区| 麻豆成人av在线| 免费看国产一级片| 国内毛片久久| 国产精品私拍pans大尺度在线| 牛牛精品在线视频| 欧美精品三级日韩久久| www.99re7.com| 中文字幕不卡在线播放| 亚洲一区在线不卡| 精品久久久久久久久久久aⅴ| 91九色偷拍| 成人在线不卡| 欧美自拍视频在线| 麻豆福利在线观看| 日韩视频―中文字幕| 清纯唯美亚洲色图| 日韩免费高清av| 影音先锋国产资源| 色综合久久久久综合| www.黄色在线| av不卡免费在线观看| 99精品视频免费版的特色功能| 综合色一区二区| 999日本视频| 精品一性一色一乱农村| 中文字幕亚洲天堂| 牛牛影视精品影视| 欧美色综合影院| 性生交大片免费全黄| 国产乱码精品一区二区三区av| 国产精品97在线| 久久中文字幕av| 成人av资源| 韩国三级成人在线| 国产精选久久久久久| 国精产品一区二区三区有限公司| xxx一区二区| av电影在线观看网址| 国产一区二区三区久久精品 | 97久久中文字幕| 久久久久久国产精品| 国产黄大片在线观看画质优化| 中文字幕在线看视频国产欧美在线看完整| 九色在线观看视频| 亚洲性视频网址| 国产视频二区在线观看| 日韩一区二区精品葵司在线| 天天干天天干天天干天天| 国产精品午夜在线| wwwww黄色| 中文字幕高清不卡| 国产一二三四视频| 国产精品女上位| 久久久久亚洲AV成人无码国产| 丰满少妇久久久久久久| 色哟哟网站在线观看| 懂色中文一区二区在线播放| 99riav国产精品视频| 成人中文字幕在线| 捆绑裸体绳奴bdsm亚洲| 91免费精品国自产拍在线不卡| 亚洲黄色免费在线观看| 国产香蕉久久精品综合网| xxxxwww一片| 成人精品小蝌蚪| 韩国无码一区二区三区精品| 久久久久国产一区二区三区四区| 青娱乐国产视频| 亚洲男人电影天堂| 欧美成人精品欧美一级乱黄| 日韩欧美一区二区在线| 一道本在线视频| 欧美不卡一区二区三区| 亚洲日本中文字幕在线| 亚洲系列中文字幕| 黄色网址在线免费| 97视频网站入口| 成人亚洲综合| 国产区一区二区三区| 国产精品亚洲欧美日韩一区在线 | 少妇精品久久久一区二区三区| 亚洲五月六月| 免费观看久久av| 亚洲精品一区二区三| 亚洲精品播放| 亚洲精品在线免费看| 韩日精品视频| 天堂社区在线视频| 国产99久久久国产精品| 白白色免费视频| 依依成人综合视频| 国产成人无码aa精品一区| 成人免费在线观看入口| xxxxxx国产| 亚洲国产中文字幕在线视频综合| 中文字幕视频网站| 欧美一区二区成人| 蜜桃视频在线入口www| 久久九九国产精品怡红院| 午夜影院在线观看国产主播| 91在线色戒在线| 最新亚洲国产| 裸体丰满少妇做受久久99精品| 久久影视一区| 亚洲 中文字幕 日韩 无码| 国内成人精品2018免费看| 久久撸在线视频| av电影一区二区| 欧美黄片一区二区三区| 欧美三区在线视频| 天天在线女人的天堂视频| xxx欧美精品| 日本欧美韩国| 国产精品丝袜久久久久久高清| 卡通动漫精品一区二区三区| 国产中文一区二区| 欧美丰满日韩| 成年人小视频网站| 97精品超碰一区二区三区| 校园春色 亚洲| 欧美日韩国产综合草草| 免费人成黄页在线观看忧物| 欧美激情视频免费观看| 黄毛片在线观看| 国产91在线播放| 精品深夜福利视频| 欧美在线观看黄| 国产专区综合网| 理论片大全免费理伦片| 成人av网站在线观看免费| 永久免费看片直接| 欧美亚洲精品一区| av一区二区三| 日韩小视频网址| 日韩亚洲国产免费| 色综合电影网| 青青草国产成人av片免费| 色婷婷综合在线观看| 中文字幕永久在线不卡| 久久亚洲国产成人精品性色| 黄色一区二区在线| 五月天丁香视频| **欧美日韩vr在线| 亚洲精品蜜桃乱晃| 欧美色图另类小说| 2023国产精品视频| 欧美一级淫片免费视频黄| 欧美日韩高清一区二区三区| 在线免费观看黄| 国产欧美中文字幕| 久久久国产精品| 四虎国产精品永久免费观看视频| 91在线免费播放| 欧美一区二区三区四| 欧美一区二区视频免费观看| 日本视频不卡| 91日本在线视频| 欧美全黄视频| 中文字幕第88页| 亚洲天堂中文字幕| 久久久久久久久久久影院| 亚洲男女自偷自拍图片另类| av片在线观看永久免费| 欧美在线视频观看| 国产精品一区高清| 一二三四视频社区在线| bt欧美亚洲午夜电影天堂| 精品不卡一区二区| 精品人在线二区三区| 96av在线| 91亚洲国产精品| 国内精品福利| 国产全是老熟女太爽了| 一区二区激情视频| 午夜av免费观看| 国产精品成人aaaaa网站| 狼人天天伊人久久| 久久国产乱子伦免费精品| 国产精品国产三级国产aⅴ入口| 国产白浆在线观看| 51午夜精品视频| 99re66热这里只有精品8| 色哟哟视频在线| 欧美日韩美少妇| 白白色在线观看| 99国产视频在线| 日韩精品三区四区| 超碰手机在线观看| 亚洲欧美在线一区| 特黄毛片在线观看| 夜夜春亚洲嫩草影视日日摸夜夜添夜| 国产精品一区二区免费不卡| 综合网在线观看| 九九久久精品一区| 欧美视频二区欧美影视| 99爱视频在线| 亚洲九九爱视频| 国产最新视频在线| 国产精品三区在线| 亚洲先锋成人|