亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

C++11新特性實(shí)戰(zhàn):列表初始化、移動(dòng)語(yǔ)義、lambda與function/bind

C++11新特性實(shí)戰(zhàn):列表初始化、移動(dòng)語(yǔ)義、lambda與function/bind C11【第七篇】 ——— 列表初始化、移動(dòng)語(yǔ)義、可變參數(shù)模板、lambda表達(dá)式、function包裝器和bind包裝器C11這批特性出來(lái)之后很多老代碼的回頭率真的低了不少。列表初始化、移動(dòng)語(yǔ)義、可變參數(shù)模板、lambda、function、bind這幾個(gè)東西單獨(dú)拿出來(lái)每一個(gè)都能寫幾千字但日常開(kāi)發(fā)里它們往往是一起出現(xiàn)的移動(dòng)語(yǔ)義解決深層拷貝的痛lambda順手解決回調(diào)冗長(zhǎng)的問(wèn)題function和bind把各種可調(diào)用對(duì)象收編成統(tǒng)一類型可變參數(shù)模板在日志和工廠函數(shù)里直接省掉一坨重載。這篇作為C11系列第七篇默認(rèn)你已經(jīng)有C98的使用基礎(chǔ)能看懂模板、類、左值右值的基本概念但對(duì)這批現(xiàn)代C特性還沒(méi)有系統(tǒng)梳理過(guò)。我會(huì)結(jié)合自己實(shí)際改代碼、寫庫(kù)、做框架時(shí)踩過(guò)的坑把每個(gè)語(yǔ)法的核心作用、底層邏輯和典型場(chǎng)景說(shuō)透。1. 列表初始化C11給初始化方式立的規(guī)矩1.1 為什么一定要用花括號(hào)C98時(shí)代初始化方式散得離譜。數(shù)組有int arr[] {1,2,3};結(jié)構(gòu)體可以Point p {1,2};單個(gè)變量既可以直接賦值int x 5;也可以用構(gòu)造std::vectorint v(10);連指針初始化還分nullptr出來(lái)之前用NULL又是一堆坑。散亂意味著什么意味著代碼風(fēng)格不統(tǒng)一意味著模板代碼想把任意類型初始化成一個(gè)值非常麻煩。C11給出的方案是統(tǒng)一花括號(hào)初始化列表初始化。不管是內(nèi)置類型、數(shù)組、結(jié)構(gòu)體、還是std::vector、std::map這種容器都可以用一對(duì)花括號(hào)把初始化列表寫清楚int x{ 5 }; int arr[]{ 1, 2, 3 }; Point p{ 1, 2 }; std::vectorint v{ 1, 2, 3, 4 }; std::mapstd::string, int m{ {a, 1}, {b, 2} };這個(gè)看似簡(jiǎn)單的改動(dòng)最大的意義在于讓初始化變成了“一種可以傳給模板和泛型代碼的語(yǔ)法結(jié)構(gòu)”。我在寫泛型工廠時(shí)最直觀的感受就是以前要從一個(gè)參數(shù)列表去構(gòu)造任意類型你得手寫一堆構(gòu)造調(diào)用有了列表初始化和后面要講的可變參數(shù)模板一套代碼就能把任意類型任意參數(shù)的構(gòu)造都接住這個(gè)收益是長(zhǎng)期存在的。另外花括號(hào)初始化也在代碼風(fēng)格上給出了極大的整潔度。團(tuán)隊(duì)里只要規(guī)定“能用花括號(hào)初始化就盡量用”新老代碼的閱讀成本立刻下降這個(gè)對(duì)維護(hù)期的收益比很多人想象的大。1.2 initializer_list 與構(gòu)造函數(shù)的“搶人大戰(zhàn)”花括號(hào)初始化背后依賴的核心類型是std::initializer_listT。當(dāng)一個(gè)類定義了接受std::initializer_listT的構(gòu)造函數(shù)時(shí)用花括號(hào)初始化它就會(huì)優(yōu)先走這條路徑class MyData { public: MyData(std::initializer_listint list) { std::cout initializer_list 構(gòu)造, 元素?cái)?shù)量 list.size() std::endl; } MyData(int a, int b) { std::cout (int, int) 構(gòu)造 std::endl; } }; MyData d1{ 1, 2, 3 }; // 走 initializer_list MyData d2(1, 2); // 走 (int, int) MyData d3{ 1, 2 }; // 注意走 initializer_list 而不是 (int, int)這就是經(jīng)典坑點(diǎn)只要該類有 initializer_list 構(gòu)造函數(shù)花括號(hào)初始化就優(yōu)先匹配它哪怕另一個(gè)普通構(gòu)造函數(shù)匹配得“更精確”也不行。d3{1, 2}這種寫法很多人以為會(huì)走進(jìn)(int, int)實(shí)際卻去了列表構(gòu)造結(jié)果可能完全不一樣。這類問(wèn)題在標(biāo)準(zhǔn)庫(kù)容器上表現(xiàn)得更加直接std::vectorint v1(10, 1); // 10個(gè)元素全部為1 std::vectorint v2{ 10, 1 }; // 2個(gè)元素分別是10和1v2這種寫法在代碼評(píng)審里經(jīng)常被年輕人拿來(lái)炫技但誤用也確實(shí)容易產(chǎn)生邏輯錯(cuò)誤。生產(chǎn)環(huán)境下我更建議容器初始化明確的數(shù)據(jù)用花括號(hào)想要“填充n個(gè)值”這種語(yǔ)義就用圓括號(hào)別讓閱讀者猜。1.3 窄化轉(zhuǎn)換編譯期的安全檢查列表初始化另一個(gè)被低估的價(jià)值是禁止窄化轉(zhuǎn)換narrowing conversion。所謂窄化就是把一個(gè)高精度或大范圍的值隱式轉(zhuǎn)換成一個(gè)可能精度丟失或范圍縮小的類型。C98里這些都是默許的頂多出個(gè)警告但警告經(jīng)常被忽略double pi 3.14159; int a pi; // 編譯通過(guò)警告后靜默截?cái)?int b{ pi }; // 編譯錯(cuò)誤double 到 int 是窄化轉(zhuǎn)換用花括號(hào)初始化時(shí)編譯器把這類轉(zhuǎn)換直接判為錯(cuò)誤逼你顯式寫出意圖int b{ static_castint(pi) }; // 顯式轉(zhuǎn)換OK這個(gè)特性在維護(hù)大型項(xiàng)目時(shí)是個(gè)保護(hù)傘。我見(jiàn)過(guò)太多因?yàn)轭愋娃D(zhuǎn)換丟精度產(chǎn)線上出事故的case罪魁禍?zhǔn)兹悄切┞愕碾[式轉(zhuǎn)換?,F(xiàn)在不少現(xiàn)代代碼規(guī)范直接規(guī)定初始化必須用花括號(hào)顯式轉(zhuǎn)換必須用 static_cast兩者配合從源頭掐掉了一大批類型相關(guān)的隱蔽bug。唯一需要留意的是如果你在寫老代碼遷移一股腦全改成花括號(hào)初始化那編譯器會(huì)突然報(bào)出一堆“無(wú)法編譯”的錯(cuò)這時(shí)候先別慌著用 static_cast 強(qiáng)行改回去要逐個(gè)確認(rèn)那個(gè)窄化到底是有意還是無(wú)意往往能發(fā)現(xiàn)幾個(gè)之前被忽略的真實(shí)缺陷。2. 移動(dòng)語(yǔ)義拷貝之外的第二條路2.1 右值引用到底在表達(dá)什么在C11之前左值右值的概念在語(yǔ)法層面只有“能不能取地址”這種粗糙的區(qū)分。C11引入右值引用之后我們可以寫一個(gè)專門接收“臨時(shí)對(duì)象”的接口臨時(shí)對(duì)象本質(zhì)上是一個(gè)馬上要被銷毀的資源包這時(shí)再去深拷貝就是白白浪費(fèi)性能。移動(dòng)語(yǔ)義的精髓不是“快一點(diǎn)”而是“本來(lái)就不用復(fù)制”。右值引用理解上有個(gè)常見(jiàn)障礙它不是用來(lái)給變量“起一個(gè)右值的別名”的而是表示“這個(gè)東西是可以被掏空的臨時(shí)資源”。所以std::move的邏輯其實(shí)是把一個(gè)左值顯式地標(biāo)注成“我允許你把它當(dāng)臨時(shí)對(duì)象掏空”之后移動(dòng)構(gòu)造函數(shù)就會(huì)把資源指針直接拿過(guò)來(lái)把源對(duì)象置為空。class BigBuffer { public: BigBuffer(size_t size) : size_(size), data_(new char[size]) { memset(data_, 0, size); } // 拷貝構(gòu)造深拷貝整塊內(nèi)存 BigBuffer(const BigBuffer other) : size_(other.size_), data_(new char[other.size_]) { memcpy(data_, other.data_, size_); std::cout 拷貝構(gòu)造被調(diào)用 std::endl; } // 移動(dòng)構(gòu)造直接接管指針 BigBuffer(BigBuffer other) noexcept : size_(other.size_), data_(other.data_) { other.data_ nullptr; other.size_ 0; std::cout 移動(dòng)構(gòu)造被調(diào)用 std::endl; } ~BigBuffer() { delete[] data_; } private: size_t size_; char* data_; };看這個(gè)BigBuffer的兩個(gè)構(gòu)造拷貝構(gòu)造要把整塊內(nèi)存復(fù)制一份如果這塊內(nèi)存是幾十MB一次深拷貝就是幾十MB的讀寫移動(dòng)構(gòu)造只是把指針從源對(duì)象手里拿過(guò)來(lái)再把源對(duì)象指針置空成本幾乎為零。這個(gè)差別在容器動(dòng)態(tài)擴(kuò)容、函數(shù)按值返回、中間臨時(shí)對(duì)象傳遞這些場(chǎng)景中是數(shù)量級(jí)的性能差異。2.2 移動(dòng)賦值與“源對(duì)象被掏空”的紀(jì)律有移動(dòng)構(gòu)造自然就有移動(dòng)賦值BigBuffer operator(BigBuffer other) noexcept { if (this ! other) { delete[] data_; data_ other.data_; size_ other.size_; other.data_ nullptr; other.size_ 0; } return *this; }注意這里必須先釋放自己原有的資源然后接管對(duì)方資源最后把對(duì)方置空。不釋放就接管會(huì)造成內(nèi)存泄漏少了置空那一步則會(huì)導(dǎo)致源對(duì)象的析構(gòu)函數(shù)把同一塊內(nèi)存delete兩次直接觸發(fā)double-free問(wèn)題。移動(dòng)之后源對(duì)象處于“有效但未指定”的狀態(tài)標(biāo)準(zhǔn)要求它是可以安全析構(gòu)、可以重新賦值的但你不能假設(shè)它里面還有原來(lái)的數(shù)據(jù)。我見(jiàn)過(guò)有人把std::move之后的源對(duì)象又拿去當(dāng)普通變量用讀取到nullptr或者空字符串時(shí)一臉懵。所以誠(chéng)實(shí)的做法是移動(dòng)完一個(gè)對(duì)象后要么立即丟棄它要么明確把它重新初始化/賦值成可用的狀態(tài)。這里必須強(qiáng)調(diào)一個(gè)新手常見(jiàn)的幻覺(jué)移動(dòng)語(yǔ)義并不是自動(dòng)發(fā)生的它需要類本身定義移動(dòng)構(gòu)造函數(shù)/移動(dòng)賦值。如果我們的BigBuffer只寫了拷貝構(gòu)造沒(méi)有移動(dòng)構(gòu)造那么即使調(diào)用方把臨時(shí)對(duì)象std::move過(guò)來(lái)實(shí)際執(zhí)行的還是拷貝構(gòu)造。很多性能敏感的代碼沒(méi)達(dá)到預(yù)期效果排查半天最后發(fā)現(xiàn)是類沒(méi)寫移動(dòng)構(gòu)造白白浪費(fèi)了std::move的姿態(tài)。2.3 完美轉(zhuǎn)發(fā)std::forward 的正確用法模板編程中經(jīng)常遇到一個(gè)需求寫一個(gè)中間轉(zhuǎn)發(fā)函數(shù)把參數(shù)原樣轉(zhuǎn)給另一個(gè)函數(shù)并且要保留參數(shù)的左值/右值屬性——如果原來(lái)是左值繼續(xù)當(dāng)左值傳過(guò)去如果是右值就保持右值屬性讓目標(biāo)函數(shù)能夠移動(dòng)它。這就是完美轉(zhuǎn)發(fā)。轉(zhuǎn)發(fā)引用也叫萬(wàn)能引用的寫法是T它只在模板推導(dǎo)環(huán)境下成立templatetypename T void Relay(T arg) { // 這里如果直接傳 arg會(huì)丟失右值屬性 Process(std::forwardT(arg)); }std::forwardT的作用是根據(jù)T的推導(dǎo)類型來(lái)決定把a(bǔ)rg轉(zhuǎn)換成左值還是右值。如果調(diào)用Relay時(shí)傳進(jìn)來(lái)的是右值臨時(shí)對(duì)象T會(huì)被推導(dǎo)成某個(gè)具體類型forward就會(huì)把a(bǔ)rg重新轉(zhuǎn)回右值引用讓下游能用移動(dòng)語(yǔ)義接管它如果傳進(jìn)來(lái)的是左值T推導(dǎo)成左值引用forward就原樣以左值傳遞。我在實(shí)現(xiàn)一些“軟件總線”式的中轉(zhuǎn)模塊時(shí)經(jīng)常用這個(gè)手法一個(gè)函數(shù)接收任意類型任意數(shù)量的參數(shù)然后轉(zhuǎn)發(fā)給真正處理請(qǐng)求的對(duì)象。不用完美轉(zhuǎn)發(fā)的話參數(shù)每經(jīng)過(guò)一層中轉(zhuǎn)都會(huì)損失類型信息臨時(shí)對(duì)象被迫退化成拷貝性能在多層轉(zhuǎn)發(fā)后會(huì)累積惡化。3. 可變參數(shù)模板編譯期的參數(shù)“打包”和“拆包”3.1 參數(shù)包怎么定義和展開(kāi)可變參數(shù)模板讓函數(shù)和類可以接受任意數(shù)量、任意類型的參數(shù)。這在C98里只能靠重載或者va_list這種類型不安全的方式實(shí)現(xiàn)而在C11里參數(shù)的類型安全由編譯器保證。定義一個(gè)可變參數(shù)模板函數(shù)最基本的樣子templatetypename T void PrintOne(T value) { std::cout value std::endl; } templatetypename T, typename... Args void PrintMany(T first, Args... rest) { std::cout first ; PrintMany(rest...); }Args是一個(gè)模板參數(shù)包rest是一個(gè)函數(shù)參數(shù)包。rest...這個(gè)語(yǔ)法叫參數(shù)包展開(kāi)把當(dāng)前函數(shù)收到的剩余參數(shù)逐個(gè)展開(kāi)再去調(diào)用下一層。整個(gè)遞歸過(guò)程會(huì)在參數(shù)包為空時(shí)落到那個(gè)單參數(shù)的重載上形成終止條件。很多初學(xué)者剛看到這個(gè)遞歸會(huì)覺(jué)得恐怖其實(shí)它就是編譯器在編譯期做了N層實(shí)例化每一層削掉一個(gè)參數(shù)直到削光。每個(gè)不同的參數(shù)組合都會(huì)生成一個(gè)獨(dú)立的函數(shù)實(shí)例所以如果調(diào)用方參數(shù)類型很多模板實(shí)例化數(shù)量也會(huì)增加編譯時(shí)間變長(zhǎng)。但換來(lái)的是運(yùn)行時(shí)的絕對(duì)高效——所有參數(shù)處理都發(fā)生在編譯期運(yùn)行時(shí)沒(méi)有一個(gè)額外的分支判斷。sizeof...可以在不遞歸的情況下直接獲得參數(shù)個(gè)數(shù)templatetypename... Args void CountArgs(Args... args) { std::cout 模板參數(shù)個(gè)數(shù) sizeof...(Args) std::endl; std::cout 運(yùn)行時(shí)參數(shù)個(gè)數(shù) sizeof...(args) std::endl; }這個(gè)操作符在遞歸展開(kāi)前做數(shù)量判斷非常有用可以提前剪枝一些特化分支。3.2 遞歸展開(kāi)最常見(jiàn)的套路可變參數(shù)模板最樸素的用法就是一個(gè)“處理一個(gè)剩下的交給下一層”的遞歸展開(kāi)。上面打印的例子就是這樣的但實(shí)際項(xiàng)目中我更多用它做日志系統(tǒng)。比如寫一個(gè)能把任意類型任意數(shù)量參數(shù)拼進(jìn)一條日志消息的工具class Logger { public: templatetypename... Args void Log(Args... args) { std::ostringstream oss; Append(oss, std::forwardArgs(args)...); WriteLine(oss.str()); } private: templatetypename T void Append(std::ostringstream oss, T value) { oss std::forwardT(value); } templatetypename T, typename... Args void Append(std::ostringstream oss, T first, Args... rest) { oss std::forwardT(first); Append(oss, std::forwardArgs(rest)...); } };這里我特意用了Args...轉(zhuǎn)發(fā)引用保證傳入的臨時(shí)字符串在拼日志時(shí)不會(huì)經(jīng)歷不必要的拷貝。日志系統(tǒng)往往處在高頻路徑上這類微小的性能優(yōu)化在實(shí)際壓測(cè)中是能看出來(lái)的。使用遞歸展開(kāi)要注意一個(gè)細(xì)節(jié)遞歸調(diào)用必須用rest...把剩下的參數(shù)展開(kāi)少寫一個(gè)省略號(hào)編譯器會(huì)立刻報(bào)錯(cuò)“參數(shù)包必須至少展開(kāi)到一個(gè)參數(shù)”。錯(cuò)誤信息比較長(zhǎng)新手容易慌其實(shí)核心就是檢查省略號(hào)位置。另外終止重載有條件是不能依賴運(yùn)行時(shí)判斷的必須是編譯期的結(jié)構(gòu)——要么用重載特化要么用if constexprC17的解決方案C11下比較穩(wěn)妥的辦法就是用重載或者偏特化來(lái)終止。3.3 逗號(hào)表達(dá)式展開(kāi)不用遞歸的另一種方案遞歸展開(kāi)思路清晰但每到N層參數(shù)就要實(shí)例化N個(gè)函數(shù)編譯時(shí)間會(huì)變成負(fù)擔(dān)。還有一種更緊湊的展開(kāi)語(yǔ)法利用逗號(hào)表達(dá)式和初始化列表一次性把參數(shù)全部處理完templatetypename... Args void PrintAll(Args... args) { int dummy[] { (std::cout args, 0)... }; (void)dummy; }拆開(kāi)看(std::cout args, 0)是一個(gè)逗號(hào)表達(dá)式——先執(zhí)行std::cout args再把0作為整個(gè)表達(dá)式的值。然后對(duì)這個(gè)表達(dá)式做參數(shù)包展開(kāi)得到的實(shí)際是int dummy[] { (std::cout arg1, 0), (std::cout arg2, 0), ..., 0 };因?yàn)閟td::cout arg1返回的還是流對(duì)象不是int為了湊出數(shù)組元素類型為int用逗號(hào)表達(dá)式的0來(lái)兜底。這個(gè)技巧不必搞得花里胡哨但確實(shí)在一些空格分隔、不分層的場(chǎng)景比如把多個(gè)字符串直接拼進(jìn)一個(gè)緩沖區(qū)里比遞歸更簡(jiǎn)潔也省了一次次實(shí)例化遞歸殼子的開(kāi)銷。我還見(jiàn)過(guò)一種變體是用std::initializer_listint{ (fun(args), 0)... }來(lái)展開(kāi)效果類似。不管哪種寫法核心都是“用逗號(hào)表達(dá)式把真正的參數(shù)操作變成數(shù)組初始化表達(dá)式列表”這是C11時(shí)代沒(méi)有折疊表達(dá)式時(shí)的經(jīng)典套路。到C17之后折疊表達(dá)式(std::cout ... args)直接把這個(gè)場(chǎng)景簡(jiǎn)化成一行但如果你的項(xiàng)目還鎖在C11標(biāo)準(zhǔn)這兩種展開(kāi)方式就得熟練掌握。4. Lambda表達(dá)式就地定義一個(gè)匿名函數(shù)對(duì)象4.1 完整語(yǔ)法和默認(rèn)行為lambda表達(dá)式提供了一種就地定義匿名函數(shù)對(duì)象的方式常見(jiàn)的完整語(yǔ)法長(zhǎng)這樣[捕獲列表](參數(shù)列表) mutable - 返回類型 { 函數(shù)體 };最簡(jiǎn)化形態(tài)甚至可以省略圓括號(hào)和返回類型比如auto f [] { std::cout hello std::endl; }; auto add [](int a, int b) { return a b; };返回類型在函數(shù)體只有一個(gè)return時(shí)一般可以靠auto推斷但如果函數(shù)體內(nèi)多處返回不同類型的值或者類型比較復(fù)雜就需要顯式寫上尾置返回類型auto transform [](const std::string s) - int { return static_castint(s.size()); };關(guān)于mutable關(guān)鍵字有個(gè)容易混淆的點(diǎn)lambda的默認(rèn)行為是捕獲列表里的值拷貝并且在lambda體內(nèi)是只讀的。想修改拷貝進(jìn)來(lái)的變量必須加mutableint count 0; auto counter [count]() mutable { return count; }; counter(); // 1 counter(); // 2 std::cout count; // 仍然是 0說(shuō)明改的是lambda內(nèi)部拷貝的值不加mutablecount這行會(huì)直接編譯報(bào)錯(cuò)。很多人看到這個(gè)報(bào)錯(cuò)第一反應(yīng)是“是不是lambda不能修改外部變量”其實(shí)是忘了它是只讀語(yǔ)義。4.2 捕獲方式的選擇值、引用、混合捕獲捕獲列表是lambda的靈魂也是最容易產(chǎn)生生命周期bug的地方。幾種寫法各有適用場(chǎng)景[value]按值捕獲lambda內(nèi)部持有外部變量的拷貝。[ref]按引用捕獲lambda內(nèi)部持有的是外部變量的引用。[]默認(rèn)按值捕獲所有使用到的變量。[]默認(rèn)按引用捕獲所有使用到的變量。[, flag]混合捕獲flag用引用其余按值。按值捕獲看起來(lái)安全但要注意它拷貝的是“捕獲時(shí)刻”的變量快照。下面這段代碼是經(jīng)典陷阱std::functionvoid(int) funcs[5]; for (int i 0; i 5; i) { funcs[i] [i](int x) { return x i; }; // OKi按值捕獲每個(gè)lambda有自己的i快照 }如果把[i]寫成[]或者[i]那么所有l(wèi)ambda共享同一個(gè)i變量的引用循環(huán)結(jié)束后 i 的值是5所有l(wèi)ambda再執(zhí)行時(shí)拿到的都是5。這個(gè)錯(cuò)誤在“循環(huán)里注冊(cè)回調(diào)”的場(chǎng)景中幾乎人人都會(huì)踩一腳而且非常隱蔽因?yàn)榫幾g毫無(wú)問(wèn)題只有運(yùn)行時(shí)行為不對(duì)。另一類生命周期問(wèn)題是引用捕獲局部對(duì)象。比如有一個(gè)函數(shù)創(chuàng)建了一個(gè)局部對(duì)象然后返回一個(gè)捕獲了該對(duì)象引用的lambdastd::functionint() MakeFunctor() { int v 42; return [v]() { return v; }; // 引用懸空函數(shù)結(jié)束后v已銷毀 }這種代碼就是未定義行為。正確做法是按值捕獲[v]或者把局部對(duì)象放到堆上并用std::shared_ptr管理后讓lambda捕獲智能指針的拷貝。我在代碼評(píng)審中見(jiàn)過(guò)好幾例類似寫法全是抱著僥幸心理覺(jué)得“這個(gè)函數(shù)應(yīng)該不會(huì)很快返回吧”結(jié)果程序運(yùn)行一段時(shí)間后偶發(fā)亂值排錯(cuò)成本遠(yuǎn)超寫代碼成本。4.3 lambda在STL算法中的實(shí)戰(zhàn)lambda在C11里最大的用武之地是配合algorithm頭文件里的算法。以前寫std::sort要定義一個(gè)比較函數(shù)或者函數(shù)對(duì)象// C98風(fēng)格 bool CmpDesc(int a, int b) { return a b; } std::sort(v.begin(), v.end(), CmpDesc);有了lambda之后std::sort(v.begin(), v.end(), [](int a, int b) { return a b; }); std::vectorint nums{ 5, 3, 8, 1, 9 }; int threshold 5; auto count std::count_if(nums.begin(), nums.end(), [threshold](int x) { return x threshold; });這種寫法把邏輯直接放到使用處既避免了“函數(shù)定義和使用地點(diǎn)分離導(dǎo)致的上下文割裂”又天然支持捕獲外部變量比函數(shù)對(duì)象寫起來(lái)緊湊得多。我習(xí)慣把lambda用在項(xiàng)目里的這些高頻場(chǎng)景做排序、查找、過(guò)濾的自定義謂詞作為事件回調(diào)、定時(shí)器的處理函數(shù)延遲執(zhí)行一小段邏輯比如保存到資源析構(gòu)時(shí)才執(zhí)行的清理動(dòng)作配合std::function做接口統(tǒng)一的策略回調(diào)。使用lambda時(shí)最好遵循一個(gè)原則lambda函數(shù)體不要寫太長(zhǎng)。正常四五行的邏輯是最舒服的如果超過(guò)十幾行說(shuō)明這段邏輯值得提取成一個(gè)具名函數(shù)或成員函數(shù)否則代碼的可讀性會(huì)因?yàn)椤扒短自谝欢阉惴ㄕ{(diào)用里的匿名邏輯”而急劇下降。5. function包裝器把可調(diào)用對(duì)象統(tǒng)一收納5.1 std::function 的使用與類型擦除std::function是一個(gè)通用多態(tài)函數(shù)包裝器它可以存儲(chǔ)、復(fù)制、調(diào)用任何可調(diào)用對(duì)象包括普通函數(shù)、函數(shù)指針、lambda表達(dá)式、函數(shù)對(duì)象以及用std::bind生成的綁定對(duì)象。它的核心價(jià)值在于用一個(gè)統(tǒng)一的類型去表示“具有特定簽名的可調(diào)用操作”。#include functional std::functionint(int, int) op; op [](int a, int b) { return a b; }; // lambda op [](int a, int b) { return a * b; }; // 換個(gè)lambda op std::multipliesint(); // 函數(shù)對(duì)象 op MyFunc; // 普通函數(shù)這個(gè)能力背后是類型擦除機(jī)制。簡(jiǎn)單說(shuō)std::function內(nèi)部維護(hù)了一個(gè)抽象基類和一個(gè)具體的包裝類模板模板里面保存著原始可調(diào)用對(duì)象的副本同時(shí)實(shí)現(xiàn)了統(tǒng)一的調(diào)用接口operator()。外部只看到std::functionint(int,int)這樣一個(gè)明確的簽名不知道里面到底存的是函數(shù)指針、lambda還是函數(shù)對(duì)象。這個(gè)過(guò)程有點(diǎn)像“把所有形狀各異的插頭插到一個(gè)萬(wàn)能插座上對(duì)外只暴露同一個(gè)三相插口”。在實(shí)際工程里std::function最大的意義在于把回調(diào)注冊(cè)、策略注入、事件分發(fā)這些場(chǎng)景的可調(diào)用對(duì)象類型全部統(tǒng)一了。比如一個(gè)按鈕的點(diǎn)擊事件回調(diào)你既可以注冊(cè)一個(gè)成員函數(shù)通過(guò)bind也可以注冊(cè)一個(gè)lambda外部存儲(chǔ)的都是std::functionvoid()。5.2 回調(diào)場(chǎng)景下的正確姿勢(shì)我重構(gòu)過(guò)一些把裸函數(shù)指針作為回調(diào)參數(shù)的舊模塊最大的痛點(diǎn)就是函數(shù)指針無(wú)法捕獲狀態(tài)。你想傳一個(gè)“帶業(yè)務(wù)上下文”的回調(diào)只能通過(guò)void* user_data再傳一個(gè)裸指針各種生命周期隱患。有了std::function之后業(yè)務(wù)數(shù)據(jù)可以直接被lambda捕獲根本不需要void*這種極度不安全的通道。真實(shí)模塊里經(jīng)常是這樣的class EventDispatcher { public: using Handler std::functionvoid(const Event); void RegisterHandler(int eventType, Handler handler) { handlers_[eventType].push_back(std::move(handler)); } void Dispatch(int eventType, const Event evt) { auto it handlers_.find(eventType); if (it ! handlers_.end()) { for (auto h : it-second) { h(evt); } } } private: std::unordered_mapint, std::vectorHandler handlers_; };這個(gè)模式在各語(yǔ)言里都很常見(jiàn)C11以前要實(shí)現(xiàn)得費(fèi)不少勁現(xiàn)在用std::function幾行搞定。注意我在RegisterHandler里用了std::move(handler)因?yàn)閟td::function內(nèi)部保存的是可調(diào)用對(duì)象的副本這步能省一次深度拷貝。5.3 function 的性能與坑std::function性能上確實(shí)有開(kāi)銷核心是間接調(diào)用和可能的堆分配。它內(nèi)部存儲(chǔ)可調(diào)用對(duì)象的副本如果可調(diào)用對(duì)象小比如無(wú)捕獲的lambda等同于一個(gè)函數(shù)指針很多實(shí)現(xiàn)在棧上通過(guò)小對(duì)象優(yōu)化就直接存了但如果捕獲了大量狀態(tài)的lambda體積大就可能觸發(fā)動(dòng)態(tài)內(nèi)存分配。我在做高頻回調(diào)系統(tǒng)時(shí)實(shí)測(cè)過(guò)用裸函數(shù)指針一次間接調(diào)用幾納秒到幾十納秒std::function會(huì)有額外幾納秒到幾十納秒的開(kāi)銷。在真正的熱路徑比如每幀幾十萬(wàn)次回調(diào)上這個(gè)開(kāi)銷會(huì)被放大這時(shí)要么換裸函數(shù)指針要么用更輕量的專用回調(diào)類型。另一個(gè)坑是拷貝std::function的開(kāi)銷。std::function是可拷貝的但拷貝一個(gè)里面裝了很大lambda的std::function等于拷貝了那份捕獲狀態(tài)。所以函數(shù)傳參和注冊(cè)時(shí)優(yōu)先用const std::function...接收內(nèi)部需要保存時(shí)再拷貝或std::move別動(dòng)不動(dòng)作值傳遞// 不推薦 void RegisterCallback(std::functionvoid() cb) { callbacks_.push_back(cb); // 至少一次拷貝 } // 推薦 void RegisterCallback(const std::functionvoid() cb) { callbacks_.push_back(cb); } // 或者右值版本 void RegisterCallback(std::functionvoid() cb) { callbacks_.push_back(std::move(cb)); }如果某個(gè)std::function永遠(yuǎn)沒(méi)有被調(diào)用但它的捕獲對(duì)象很大那么這個(gè)對(duì)象就一直占著內(nèi)存直到std::function被銷毀或重新賦值。一些長(zhǎng)生命周期的事件表容易在不知不覺(jué)中累積大量捕獲上下文排查內(nèi)存占用時(shí)記得檢查std::function的捕獲體量。6. bind包裝器把函數(shù)參數(shù)“提前預(yù)定”出新的可調(diào)用對(duì)象6.1 std::bind 的基本操作std::bind用來(lái)生成一個(gè)“綁定了一部分參數(shù)”的新可調(diào)用對(duì)象它把事情分成兩半一半在處理函數(shù)定義完之后就已知另一半留給真正調(diào)用時(shí)再傳。#include functional int Add(int a, int b) { return a b; } using namespace std::placeholders; auto add5 std::bind(Add, 5, _1); std::cout add5(3) std::endl; // 輸出8等價(jià)于 Add(5, 3) auto add5and10 std::bind(Add, 5, 10); std::cout add5and10() std::endl; // 輸出15參數(shù)全部綁定調(diào)用時(shí)無(wú)需傳參_1、_2這些是占位符表示“這個(gè)位置留給調(diào)用時(shí)傳入的第一個(gè)、第二個(gè)參數(shù)”。占位符放在第幾個(gè)位置就代表調(diào)用傳入的參數(shù)填到對(duì)應(yīng)位置。利用這個(gè)機(jī)制還可以調(diào)整參數(shù)順序auto swapAdd std::bind(Add, _2, _1); std::cout swapAdd(3, 4) std::endl; // 等價(jià)于 Add(4, 3)輸出7這個(gè)“參數(shù)重排”能力在適配第三方接口時(shí)非常實(shí)用。比如一個(gè)消息處理器的回調(diào)簽名是void Handle(int msgType, int priority, const Message msg)而你的處理函數(shù)只關(guān)心 priority 不為0的消息并且你的處理函數(shù)簽名是void Process(const Message msg)可以直接auto binder std::bind(Processor::Process, processor, std::placeholders::_3); // 只取第3個(gè)參數(shù)傳給Process6.2 綁定成員函數(shù)和對(duì)引用的處理綁定成員函數(shù)是std::bind的高頻用法。成員函數(shù)隱含第一個(gè)參數(shù)是對(duì)象本身所以Processor::Process后面要么接對(duì)象指針要么接對(duì)象引用或拷貝Processor processor; auto binder std::bind(Processor::Process, processor, std::placeholders::_1); // 或者 auto binder2 std::bind(Processor::Process, processor, std::placeholders::_1); // 按值拷貝對(duì)象注意大對(duì)象拷貝開(kāi)銷我個(gè)人的習(xí)慣是對(duì)象生命周期明確長(zhǎng)于回調(diào)時(shí)用processor綁定不確定生命周期時(shí)優(yōu)先考慮std::shared_ptrProcessor的拷貝加std::bind的占位策略甚至直接改用lambda捕獲智能指針更直白。綁定引用參數(shù)時(shí)有個(gè)隱蔽坑std::bind默認(rèn)按值保存綁定參數(shù)。如果函數(shù)參數(shù)是引用類型直接 bind 一個(gè)變量進(jìn)去實(shí)際綁定的是它的拷貝函數(shù)內(nèi)部改引用不會(huì)影響原變量。想要綁定真正的引用必須使用std::refvoid UpdateCount(int n) { n 10; } int count 0; auto binder std::bind(UpdateCount, count); // 按值綁定改了沒(méi)反應(yīng) auto binderRef std::bind(UpdateCount, std::ref(count)); // 綁定真實(shí)引用 binder(); binderRef(); std::cout count; // 輸出10binderRef那次修改生效了std::ref返回一個(gè)引用包裝器這是一個(gè)C11里看起來(lái)簡(jiǎn)單但使用頻率不低的工具。凡是需要把引用“當(dāng)值”傳遞的場(chǎng)景包括std::thread、std::bind、std::function的捕獲都必須靠它來(lái)表達(dá)引用語(yǔ)義。6.3 bind 和 lambda 該怎么選很多人糾結(jié)std::bind和lambda哪一個(gè)更好。我的結(jié)論非常直接C11項(xiàng)目里能用lambda的地方優(yōu)先用lambda只有在確實(shí)需要參數(shù)重排、或者一些極其簡(jiǎn)單的綁定場(chǎng)景才考慮bind。原因有三方面。第一lambda語(yǔ)法更直觀可讀性更好[processor](int x){ processor.Process(x); }一眼能看懂捕獲了誰(shuí)調(diào)用了誰(shuí)而std::bind(Processor::Process, processor, _1)對(duì)不熟悉bind的人來(lái)說(shuō)還要反應(yīng)一下。第二lambda的捕獲是顯式的[]、[]、[a]而bind是隱式按值保存在內(nèi)部包裝對(duì)象里排查生命周期問(wèn)題時(shí)lambda更直觀。第三編譯器對(duì)普通lambda的優(yōu)化能力比對(duì)std::bind生成的復(fù)雜包裝對(duì)象更強(qiáng)內(nèi)聯(lián)概率更高。但 bind 并不是完全沒(méi)有價(jià)值。在某些需要真正“參數(shù)重排”的適配場(chǎng)景或者早期C11代碼風(fēng)格已經(jīng)在團(tuán)隊(duì)里形成慣例的項(xiàng)目里bind依然是可讀的。而且std::bind和std::function配合得相當(dāng)自然std::functionvoid(int) callback std::bind(Processor::Process, processor, _1);在C14、C17之后泛型lambda和更高階特性的引入讓 bind 的使用場(chǎng)景更少了但如果你的項(xiàng)目還被鎖在C11標(biāo)準(zhǔn)bind 仍然是所有標(biāo)準(zhǔn)庫(kù)容器和類接口里的“一等公民”該會(huì)還得會(huì)。7. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄實(shí)際代碼中把這些特性組合使用踩坑的概率并不低。我把這幾年見(jiàn)過(guò)的高頻問(wèn)題整理成一組速查方便大家對(duì)照。問(wèn)題現(xiàn)象根本原因排查思路與修復(fù)花括號(hào)初始化導(dǎo)致窄化編譯錯(cuò)誤int x{doubleVal}被禁止窄化顯式static_castint或者改用圓括號(hào)初始化如果確實(shí)需要舊行為深拷貝意外發(fā)生性能突然下降類沒(méi)有定義移動(dòng)構(gòu)造/移動(dòng)賦值或者傳參時(shí)忘了std::move檢查類是否有noexcept移動(dòng)構(gòu)造檢查熱路徑上的拷貝調(diào)用循環(huán)內(nèi)注冊(cè)的lambda回調(diào)值全部相同引用捕獲了循環(huán)變量變量最終是同一個(gè)終值改按值捕獲[i]或拷貝一份局部臨時(shí)變量再捕獲lambda按引用捕獲的對(duì)象已銷毀局部變量生命周期結(jié)束引用懸空按值捕獲或者把對(duì)象生命周期延長(zhǎng)到堆上并用智能指針接管可變參數(shù)模板遞歸沒(méi)有終止重載缺少單參數(shù)版或者特化像PrintMany例子那樣補(bǔ)一個(gè)templatetypename T void Print(T)作為終止std::bind綁定引用參數(shù)但外部值不改變bind默認(rèn)按值保存參數(shù)用std::ref顯式包裝引用std::function頻繁拷貝導(dǎo)致卡頓大捕獲狀態(tài)的function被反復(fù)按值傳遞函數(shù)參數(shù)用const std::function...接收存儲(chǔ)時(shí)std::move7.1 初始化相關(guān)的坑列表初始化最大的兩個(gè)坑是窄化轉(zhuǎn)換和initializer_list的優(yōu)先級(jí)。窄化轉(zhuǎn)換編譯錯(cuò)誤一般不難定位關(guān)鍵是要定好項(xiàng)目規(guī)范在需要強(qiáng)制類型安全的代碼路徑上統(tǒng)一用花括號(hào)初始化。initializer_list的優(yōu)先級(jí)問(wèn)題則更難防我的經(jīng)驗(yàn)是凡是定義了initializer_list構(gòu)造函數(shù)的類在代碼評(píng)審時(shí)要特意檢查所有{}初始化的位置確認(rèn)確實(shí)是想走列表構(gòu)造而不是普通構(gòu)造。標(biāo)準(zhǔn)庫(kù)里std::vector、std::map、std::list都有這種行為稍不留神就會(huì)把“構(gòu)造10個(gè)元素”寫成“構(gòu)造1個(gè)元素內(nèi)容為10”。7.2 lambda捕獲引發(fā)的懸空引用lambda捕獲問(wèn)題的根源是生命周期管理。值捕獲雖然安全但也有代價(jià)捕獲了超大對(duì)象的lambda一旦存入std::function那個(gè)對(duì)象就一直被持有到function銷毀。如果這個(gè)function被存進(jìn)全局容器那就是隱形的內(nèi)存占用。我在實(shí)現(xiàn)定時(shí)任務(wù)系統(tǒng)時(shí)遇到過(guò)一個(gè)案例定時(shí)器回調(diào)捕獲了一個(gè)幾十MB的配置對(duì)象結(jié)果這個(gè)定時(shí)器對(duì)象一直存放在調(diào)度表里幾十MB內(nèi)存被白白占著。后來(lái)改成捕獲std::shared_ptrConfig的拷貝并且在回調(diào)完成時(shí)從調(diào)度表移除問(wèn)題才解除。7.3 可變參數(shù)模板遞歸不終止遞歸展開(kāi)的模板如果不加終止條件編譯器會(huì)無(wú)限遞歸實(shí)例化下去最終報(bào)錯(cuò)信息里會(huì)出現(xiàn)recursively required from 函數(shù)名...展開(kāi)的模板list一長(zhǎng)串看得人頭皮發(fā)麻。排查方法很簡(jiǎn)單從報(bào)錯(cuò)信息里找到最內(nèi)層那個(gè)沒(méi)有終止重載的調(diào)用點(diǎn)補(bǔ)上單參數(shù)版本或者空參數(shù)版本即可。另一種不易察覺(jué)的問(wèn)題是遞歸展開(kāi)的每一次實(shí)例化都會(huì)在二進(jìn)制里產(chǎn)生一個(gè)真實(shí)存在的函數(shù)符號(hào)參數(shù)多、調(diào)用頻繁時(shí)二進(jìn)制膨脹和編譯時(shí)間上漲都能感覺(jué)到。如果對(duì)編譯期性能敏感盡快考慮C17的折疊表達(dá)式或者C11下的逗號(hào)表達(dá)式展開(kāi)方案。7.4 移動(dòng)語(yǔ)義相關(guān)坑移動(dòng)之后的源對(duì)象問(wèn)題我在代碼評(píng)審時(shí)看到過(guò)的錯(cuò)誤包括移動(dòng)后直接使用源對(duì)象的成員沒(méi)檢查空指針、移動(dòng)賦值之前沒(méi)有釋放原資源造成泄漏、移動(dòng)構(gòu)造函數(shù)忘了noexcept導(dǎo)致 vector 擴(kuò)容時(shí)退化為拷貝、以及無(wú)代價(jià)地把一個(gè)左值std::move進(jìn)一個(gè)馬上還要用的地方。針對(duì)這些比較實(shí)際的規(guī)約是移動(dòng)構(gòu)造函數(shù)和移動(dòng)賦值必須標(biāo)注noexcept否則標(biāo)準(zhǔn)庫(kù)容器擴(kuò)容時(shí)可能會(huì)改用拷貝而不是移動(dòng)性能收益直接歸零。移動(dòng)后的源對(duì)象要約定“視為懸空”除了重新賦值和析構(gòu)不要讀它的成員。std::move不是“強(qiáng)制搬移”它只是把左值標(biāo)記成“可供搬移”。最終是否搬移取決于目標(biāo)類型有沒(méi)有移動(dòng)構(gòu)造/移動(dòng)賦值。7.5 function/bind的坑std::bind與std::function組合的坑通常出現(xiàn)在捕獲生命周期上。由于 bind 在存儲(chǔ)被綁定參數(shù)時(shí)默認(rèn)按值因此如果你在函數(shù)里 bind 了一個(gè)局部變量并把這個(gè)綁定器存到全局局部變量雖然已經(jīng)銷毀但 bind 內(nèi)部保存的副本還在——這其實(shí)是安全的。真正不安全的是綁定了一個(gè)std::ref(localVar)因?yàn)槟潜4娴氖钦鎸?shí)引用如果局部變量沒(méi)了引用就懸空。這種懸空與lambda引用捕獲懸空是同一個(gè)本質(zhì)問(wèn)題。排查引用懸空類bug時(shí)優(yōu)先懷疑兩處lambda的[]/[var]捕獲以及 bind 里的std::ref。另外一個(gè)容易被忽略的點(diǎn)是std::function的賦值與默認(rèn)狀態(tài)。未賦值的std::function是空的調(diào)用它時(shí)拋std::bad_function_call。在多線程回調(diào)注冊(cè)場(chǎng)景里先判斷if (handler)再做調(diào)用是必要的防御但真正安全的長(zhǎng)效方案是在回調(diào)注冊(cè)/注銷時(shí)加鎖管理避免同一個(gè)handler在執(zhí)行中被另一個(gè)線程替換或清空。8. 個(gè)人經(jīng)驗(yàn)這幾個(gè)特性組合起來(lái)才是真香單獨(dú)看列表初始化、移動(dòng)語(yǔ)義、可變參數(shù)模板、lambda、function、bind每個(gè)都是“獨(dú)立的新語(yǔ)法”但在實(shí)際工程里它們經(jīng)常是擰在一起用的。我在寫一個(gè)輕量級(jí)的消息總線模塊時(shí)這種合力體現(xiàn)得最明顯消息總線的注冊(cè)接口需要支持各種類型的事件處理器。事件處理器的類型不一樣有的是普通函數(shù)有的是成員函數(shù)有的是lambda怎么辦用std::function統(tǒng)一存儲(chǔ)配合bind把成員函數(shù)轉(zhuǎn)成std::function配合lambda捕獲業(yè)務(wù)上下文。事件對(duì)象的構(gòu)造用列表初始化加可變參數(shù)模板一條消息的參數(shù)可以全部打包進(jìn)一個(gè)對(duì)象。消息發(fā)送時(shí)用移動(dòng)語(yǔ)義把消息對(duì)象直接交給下一個(gè)模塊避免大數(shù)據(jù)拷貝。整套代碼下來(lái)比起以前C98的實(shí)現(xiàn)既簡(jiǎn)短又清晰性能還更好。如果非要說(shuō)一個(gè)最值得優(yōu)先掌握的組合我建議把“l(fā)ambda std::function 移動(dòng)語(yǔ)義”這組先練熟。它們能覆蓋日常80%的回調(diào)與策略場(chǎng)景而且思考方式可以遷移到C14、C17甚至C20的后續(xù)特性上??勺儏?shù)模板和完美轉(zhuǎn)發(fā)屬于模板庫(kù)作者級(jí)能力學(xué)習(xí)曲線稍微陡一點(diǎn)但理解了“編譯期參數(shù)打包/拆包”這個(gè)模型之后再去看std::tuple、std::make_unique這些標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)的源碼會(huì)有豁然開(kāi)朗的感覺(jué)。我自己的經(jīng)驗(yàn)里還有一個(gè)很實(shí)際的小技巧在調(diào)試模板相關(guān)的問(wèn)題時(shí)編譯錯(cuò)誤信息通常特別長(zhǎng)千萬(wàn)別從上往下掃直接翻到最底部的note:或者error:那一行往往才是真正的錯(cuò)誤源頭。配合這些新特性時(shí)代碼風(fēng)格上建議定義一套固定寫法初始化盡量用花括號(hào)移動(dòng)構(gòu)造/移動(dòng)賦值寫noexceptlambda捕獲值顯式寫出function作為回調(diào)類型統(tǒng)一用別名。時(shí)間久了你會(huì)發(fā)現(xiàn)這批特性不光是語(yǔ)法糖它們確實(shí)讓C代碼寫起來(lái)更接近“描述意圖”而不是“描述每一步操作”這也是C11最大的價(jià)值所在。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
亚洲熟女中文字幕在线| 蜜乳性色无码专日粉嫩骚逼AV| 97天天摸天天碰| 国产又色又粗又黄又爽| 婷婷九月丁香| a人欧美综合天堂麻豆| 在线不卡视频| 岛国黄色大片网站| 唐山老熟妇露脸啪啪叫| 亚洲一欧洲中文字幕在线| 国产精品乱码久久| 97 国产精品| 91 亚洲情侣偷拍 久久| 日韩操呦呦影院在线观看| 97九色人妻| 婷婷五月天影院| 色色色欧美| 亚洲欧美日韩中文播放| 1024精品在线| 97久久综合网| 黑人粗大V S日韩女优视频| 国产夜夜艹| 午夜大香蕉| 天天天天做夜夜夜夜做| 蜜臀久久99精品久久久老,,| 亚洲欧美精品91| 亚洲一区二区三区四区视频| 欧美熟爽综合| 日本一二区免费| 中文字幕一区av| 在线观看精品国产免费| 成视频在线观看免费看| 色五月首页| 九九久久99| 综合啪啪| 操操操操操操| 男人天堂最新手机版在线青青草| 国产AV天美传媒一区二区三区 | 一级性爱视频免费观看| 视频一区二区免费在线| 又粗又长又大国产不卡| 欧美日韩插逼视频| 亚洲AV成人无码一二三久久| 精品人妻中文字幕4399| 双插性欧美一二三区| 久久久亚洲欧美综合| av在线免费一区二区| 99久久久无码精品国产人| 最新亚洲人成网站在线影院| 久久久久久久国产视频| 色一情一乱一乱一区91Av| 五月综合激情| 精品人妻一区二区三区夜夜| 日日日日做夜夜夜夜做无码97| 亚洲成人AB| 麻豆成人影音在线| 91av一区二区在线观看| 精品性爱一区二区| 91男女啊啊啊| 日本性一区| 天天操天天干美女网址导航| 97爱综合| 日韩欧美aⅴ综合网站发布| 人人摸人人添人人操| 九九RE视频在线精品| 婷婷香蕉欧美在线一区二区三区| 麻豆精品A片免费观看| 综合av影片| 18禁久久| 在线观看无码三级少妇| 五月丁香综合啪啪| 欧美在线亚洲| 日本伦乱九九九综合| 国产一级内射无挡观看| 欧美色图片91| 久久久一区二区三区麻豆| AAAA级日本片免费视频| 色色色色综合网| 蜜臀AV一区二区三区激情综合| 试看60秒| 欧美精品69性爱| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 大香蕉在线SuP| 神马九九九| 欧美性91| 亚洲少妇色| 男人的天堂欧美| 日韩无码服务区| 看免费一级在线播放毛片| 亚洲图片欧洲图片aⅴ| AV九九| 久久25| 亚洲男人天堂视频 | www.狠狠干.coom| 加勒比日本在线| 九九热av| 中文字幕性感少妇av| 青青草视频导航官网| 九九九九九九精品| 天天看,天天做| 亚洲欧美精品久| 啊啊啊啊啊在线| 丁香六月激情综合| 久久影视二区三区行押| 日逼国产| 欧美亚洲激情一二三| 国产一区二区三区免费视频在性观看| 日韩乱码Av| 欧美另类丝袜熟女| 色综合网1| 亚洲熟女乱色一区二区三区久久久| 一区二区中文| 久久极品一区二区| 欧美人体性爱互联网第一页婷婷日本| 婷婷精品| 另类图片综合| 啊啊啊啊啊在线观看网址| 日日干日日摸| 久久熟女久| 蜜桃成人1区2区3区| 久久这里只精品免费福利| 中文字幕jul-617人妻熟女| 成人久久精品| 精品高清一区二区三区三州| 性性久久| 大香蕉手机视频| 另类欧美综合| 精品99999久久久久久| 国产精品视频在线观看| 色噜噜人妻av 中文字幕| 国产精品直播在线观看直播| 少妇被玩视频二三区| 欧美综合91| 99热在线观看| AV一区观看| 天堂网 主播 亚洲| 麻豆天美国美国产| 欧美A片中文字幕| 东北女人的毛片| 亚洲精品性爱片| 97操综合| 69AV女优男人的天堂| 色屁屁影院www国产| 夜夜嗷嗷一区二区| www黄片免费看com| 欧美日韩色| 欧美78p| jazzjazz国产精品麻豆| 亚爽爽爽爽爽爽爽爽| 欧美日韩操操操| 日本不卡中文| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 日本高清熟女久久一区| 91狠狠色丁香婷婷综合久久精品| 欧美性第一页| 啊灬啊灬啊灬啊灬高潮奶出了免费视| 夜夜爽爽爽| 日韩有码 一区二区三区| 欧美青青视频| 久久黄色网址| 国产亚州精品美女久久久免费| www.人人摸在线视频| 欧美人妻精品| 日韩免费看黄片| 亚洲天天在线| 久久久精| 干B| 桃花色涩综合影院| 国产中文大片资源中文字幕| 96久久久久| 校园春色宗合网| 97超碰美国| 色情五月丁香| 亚洲砖码砖专无区2023| 97超碰人人模人人拍人人| 无毛精品| 亚洲Av噜噜一区二区三区妖精| 九月丁香婷婷| 亚洲一区二区三区AV无码| 囯产精品久久久久久久久久梁医生 | 熟女突然公开看18禁影片 | 激情露脸爱| 99精品成人免费看| 强奸乱伦Av网| 内射夫妻三片| 日本东京热久久久电影| 天天看夜夜看日日干| 九九这里只有精品| 97资源站日韩| 插B在线观看| 天天干人妻| 少妇天堂网络| 精品久一区免费| 中文字幕在线播放2中文字幕在线观看2| 免费在线黄片视频| 一类无码操逼视频| 人妻丰满熟妇一区二区三| 熟女少妇视频| 久久久78| 日韩人妻无码不卡网站| 日本三级精品| 天天操福利视频综合网站| 9精品久久| 中文字幕丝袜美腿| 青青草吊丝| 97干com| 久热伊人99re| 欧美成不卡网| 伊人久久亚洲色欲综合网站| 久久九九精品一区二区 | 豆花视频操逼网址| 95自拍视频在线观看| 超碰免费人妻人人| 伊人网免费视频| 国产午夜在线观看| 国产在线能看的你懂的| AV乱伦专区| 国产精品久久久吖| 男女性感激情网站| 午夜寂寞欧美| 99热这里都是精品| 亚洲少妇诱惑| 中国小夫妻勾搭露脸淫荡对白| 爱欲AV| 大香蕉在线视频重口味毛片在线| 蜜屁Av| 麻豆天美AV传媒第一页| 亚洲在线91| 久操视频资源站公开| 家庭乱伦性爱av| 日韩丰满熟妇| 激情丁香五月婷婷| 久操 高清| 精品一二三区女同| 欧美爱爱97| 性videos欧美熟妇hdx| 岛国大片国产| 五月天色色网站| 欧美午夜精品久久久久久3D| 亚洲av热热色| 久久精品国产亚洲av水密被窝| 九九热国产| 亚洲一区操| 午夜福利免费精品视频| 色婷婷五月天| 夜夜做夜夜爽精品视频| 久久成人午夜精品影院| 激情六月天| 大香蕉天天看妹子| 拍拍拍拍大尺度黄色三级片拍拍拍拍拍照| 亚洲天天在线| 日韩av影片在线观看| 嗯嗯嗯好爽| 色眯眯av| 久久 国产 无码| av资源在线观看少妇| 啊啊啊好湿国产一二| 亚洲第一男人天堂| 国产亚洲日韩在线三区黑人| 五月开心网| 果冻传媒A片一二三区| 日本操逼视频免费| 婷婷久久五月天| 99www.bibizy香蕉资源国产一区二区三区高清| 日本亚欧爱爱| xxx0国产在线播放| 丝袜性亚洲| 99热在线只有精品| 日韩中文字幕视频在线观看| 亚洲 欧美 另类 日韩 人妻一区 | 九九香蕉网| 久久伊人青青草| 美女久久久久久久久久久| www.大香| 一区二区国产视频在线观看| 翔田千里AV无码秘 三区| 手机看片1024你懂的国产| 3PAV乱伦视频| 国产精品交换一区二区| 日韩内| 激情五月天丁香社区| 涩涩久久精品| 乱伦1色页| 日本天堂网| 人人妻人人爽一区二区三区| 中国探花熟女| 91劲爆| 黄色小视频日本txt| 女人的天堂大香蕉网| 日韩福利电影网| 狠狠欧美| 女人天堂av在线播放| 欧美另类色图片| 欧美日韩亚洲少妇寂寞影院正在播放| 日韩欧美国产高清视频| 密臀在线一区尤物| 91亚洲青青草原精品1区| 国产9l 大屁股| 十八禁啪啦拍视频无遮挡| 国产自啪精品视频网站黑丝| 无码视频黄色网战| 人人操超碰在线| 日本操逼二区| 99这里都是精品| 午夜福利视频在线一区| 中文字幕青青草| 丁香五月天堂网| 欧美亚洲首页| 91老熟女老女人国产老太| 国产在线视频二区| 国产精品动态一区二区三区四四| 日本护士高潮| 老司机午夜精品视频| 亚洲成人一二三区| 日美免费黄片| 丝袜AV一区二区三区| 99国产精品人妻人伦| 亚洲av性爱电影| 亚洲视频一二区| 国产中文字幕曰本毛片| 天天干人人乐| 69人妻精品丰满熟女区| 91色婷婷综合久久中文字幕二区| 丝袜AV一区二区三区| 欧美老熟另类| 欧美亚洲日本激情在线| 91人妻少妇| 蜜桃视频一区二区三区| 久射吧| 五月丁香啪啪网| 久久久96| 九九人妻| 国产精品乱人伊人网| 国产毛片在线| 91综合网站| 日韩不卡码| www超碰| 翔田千里一区二区三区奶水| 日天天九九天堂666| 九九成人精品| 人妻天堂综合网| 无码人妻精品一区二区中文| 亚洲在线欧美| 日韩免费a级毛片无码a∨| 精品一区二区三区18| 日产国产精品中文久久婷婷| 欧美激情超碰777| 91激情国产| 后入人妻一区| 99久热| 免费看国产曰批40分钟怎么下载| 96久久久久| 亚洲系列欧美| 久久婷婷欧美| 熟妇精品juliaannAV| 久久婷婷精品| 一区三区啪啪| 久草免费福利在线播放| 亚洲巨爆乳一区二区三区四季网| 日本 情色 1区2区3区| 青青操在线亚洲视频观看欧美在线| 色色综合网站| 亚洲性猛| 大香蕉一线视频| 国产在线播放成人免费| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 日本一区二区电影网站| 久久精品99久久久久久| 插老姨肥穴| 精品91摸| 亚洲综合春色| av大香蕉网站| 色女99一级片在线观看| 麻豆福利视频导航| 美女高潮视频91| 爽爽歪在线视频| 人妻少妇视频在线播放| 东北女人av| 亚洲男人天堂2019| 精品妇女一区二区三区| 一区二区三区 丝袜 高跟 美腿| 亚洲超碰AV| 黑丝自慰喷水网站| 精品无码产区一区二| 另类av天堂| 久久综合日韩亚洲欧美| 秋霞男人网| 97精品久久久久久久| 久久中文色图| 欧美另类自拍| 97欧美日韩中文| 欧美91网站| 91nbbbbbb| 搡老女人老91妇女熟女| 亚洲图片欧美另类综合免费视频大大香| 一本一首道人妻少妇免费久久| 亚洲欧美九九九| 激情终合网| 成熟熟女国产精品一区二区| 久久精品成人一区二区三区蜜臀 | 91碰超| 久久91精品国产9丨久久分亭| 色在线亚洲视频www| 国产Aα| 爆操无码| 日本天天吊| 亚洲一二三四区机械| 四虎884a| 98超碰欧美| a级免费在线观看| 黄片qw| 婷婷视频在线免费观看| 人妻天天夜夜爽一区二区| 欧美色图亚州激情| 亚洲色图第一页| 日韩啪啪视频| 无码人妻精品一区二区中文| 天天综合站| 亚洲欧美清纯| 日韩在线一区高清在线| 日日爽夜夜爽| 亚洲综合性网址| 怡春院久久| 国产精品国产亚洲区艳妇糸列| 美女写真| 久久9亚洲| 久久精品中文| 麻豆久久精品亚洲精品88 | 欧美性爱一区| 超碰诱惑| www.av在线视频| 人妻AV 中文字幕的| 超碰中文字幕人妻草一区| 欧美日韩小说| 中文字幕一区二区韩| 亚洲少妇喷视频看| 人妻天天爽夜夜爽2| 中文字幕在线免费观看2| 蜜乳性色无码专日粉嫩骚逼AV| 鲁鲁色综合网| 日夜尻逼网| 69XX一中文字幕人妻91| 久久黄黄| 深喉吞精| 欧美中出1| 欧美熟女丝袜| 综合国产影视三级| 日本在线不卡123| 熟妇一区,二区,三区。| 中国女人内射6XXXXX| 综合激情97 | 加勒比综合| 91精品91久久久中77777| 粉嫩久久久久| 成人激情无码在线视频| 国产偷仑| 香蕉国产精品麻豆亚洲欧美日韩| 97国产中文| 国产乱伦亚洲| 日本日日色视频| 97视频在线看| 天美av在线观看| 亚州色图欧美色图| 超碰1997| 国产大学生口爆吞精合集| 天堂69亚洲精品中文字| 少妇国产不卡| 91人妻少妇| 人人爱操| 欧姜老司机| 五月丁香激情综合| 98超碰欧美| 婷婷五月天综合网| 草草草草视频| 免费看污网站| 亚洲 无码 偷拍| 中文字幕丝袜人妻| 99亚洲精品| 91天堂视频| 国产精品盗摄 偷窥盗摄| 亚洲av热热色| 一区操逼日比视频| 中文字幕熟女人妻丝袜丝| 五月丁香社区婷婷日韩欧美精品影院 | 国产亚洲综合欧美一区| 精品97久久| 看日韩美女二区三区免费操逼视频| 欧美天天影院| 91色情黑丝搞鸡在线观看一区二区三区三州| 97中文综合| 视频二区美腿丝袜制服人妻欧美| 国产强奸乱伦第1页| av优播| 国产成人精品必看| 97在线资源| 91超级碰碰碰| 综合久久久久久久久91| 加勒比东京热五月天天堂网| 五月丁香色婷婷| 26UUU欧美日本| 熟妇人妻一区二区三在线| 欧美三级中文字幕hd| 日日夜夜骑| 九久精品| 色网在线| 午夜人妻精品综合在线| 人人 操人人 操人人| 日韩成人人妻网站| 国产一级久久久| 国产第25页在线观看| 精品视频久久| 欧洲精品久久| 在线观看一卡二卡| 综合久久六月久久婷婷| 国产在线播放成人免费| 欧美综合在线第一页| 久久久久骚| 国产大学生口爆吞精合集| 熟妇人妻丰满久久久久久久无码| 青青操少妇| 成人短视频在线观看| 欧美在线永久天堂| 国产9熟妇视频网站| 丝袜综合| 亚洲有码 欧美精品| 亚洲精品天堂久久A∨51成人漫| 欧美色干| 91熟女.com| 中文字幕片| 操碰91| 亚洲黄色a级片| 日韩激情电影中文字幕 | 国产精品免费视频人成| 欧美特大AA级黄片| 91成人无码| 亚洲AV永久无码精品成人调教| 亚洲成人精品久久久| 丁香五月天啪啪| 精品区国产区一区二区三区| 国产精品久久久久久久AV大片 | 秋霞一级鲁丝片A片| 91综合无码| 亚洲熟女少妇免费视频| 日韩精品大香蕉伊人在线| 密臀在线免费观看| 久久久999网站| 91蜜桃婷婷狠狠久久综合9色| 九九干| 国产在线强奸视频| 99re8超碰| 久7色| 狠狠操狠狠爱| www.久久爱| 色婷亚洲五月在线观看| 国内三级自拍小视频在线观看| 人妻 丝袜美腿 中文字幕| 欧美1区二区三区公司| 福利视频香蕉免费一区二区在线| 啊啊啊好想要| 亚洲乱码精品一区二区| 51国产午夜精品视频| 成人免费性爱视视| 黄色免费一级在线毛片| 国产精品ⅴ无码大片在线看.| 欧美狠狠干| 一区二区三区国产在线播放| 青娱乐福利99| 人人妻人射| 粉嫩粉嫩一区性色AV片| 黄色高清无码无码破解免费暗网| 97操操| 日韩欧美视频青青| 观看免费区二区三区二| 久久綜合很很很| 欧美成人一区二区| 亚洲。天堂。日本在线观看| 精品无码久久| 激情综合网亚洲| 日韩精品资源专区二区| 日本三级一区二区 在线| 风流老熟女一区二区三区l| 91三级理论片播放器| 日韩不卡av一二三| 日本一区三级韩国| 先锋音影AV| 99精品无码| 射综合网| 日韩综合无码色欲vv| 思思在线免费视频| 极品色社| 足交视频老司机| 91bbbbbb| 亚洲成人av电影在线| 乱伦熟女区| 大鸡吧尹人在线| 国产丸一视频| 综合网亚洲| 97爱b| 六六久久日韩不卡| 麻豆影音天美视频| 97超碰国产亚洲精品| 九九九999久久久网站| 秋霞 色色| 黄色AAAAA欧美| 婷婷导航| 91男人天堂网| 中文一区二区三区影院| 国产极品美女高潮无套在线观看| renqi久久久久久久久久久久| 天堂伊人久久| 天天插网| 91黑人无码激情在线| 中文一区二区婷婷视频| 快播久久人人aV| 无码操逼视频一下| 欧美 亚洲 综合 制服| 大屁股国产在线视频| 91在线免费精品视频| 欧日a| 色情亚洲日本成人| 欧美懂色综合网| 免费看欧美美女黄色大片| 天天综合香 ld视频| 99re黄| 日韩欧美国产高清视频| 天天影视射综合网| 欧美性爱综合,免费| h在线看免费版在线看| 熟女露脸激情自拍视频| 国产女人高潮嗷嗷嗷叫小说| 国产精品久久发布| 高清视频一区| 日韩在线观看中文字幕视频| 天天操天天7| 人人 操人人 操人人| 禁十八久久| 国产精品电影大全| 天天干一干| 伊人欧美大香蕉视频| 久草视频在线视频在线视频在线观看 | 人人妻人人操人人乐| 精品二区久久| 久久香蕉国产线看观看猫咪av | 这里只有精品视频在线观看麻豆| 丝袜喷水在线| 久久成年片色大黄全免费网站| 婷婷色综合| 9精品久久久久| 91精品黄在线观看| 少妇精品| 天天舔天天| 亚洲天天操| 美女啊啊啊啊pc| 超碰成人人人爽人人爽| 嗯嗯啊操我| 国产剧情在线| 99爱久久视频频| 色视频蜜乳| 91性感网站| 黄片免费看的| 亚洲 欧美 日本 国内 首页| 日韩无码专区| 屁股久久久久久久| 亚洲色图加勒比| 国产一区二区成人av在线播放| 亚州性色| 久久精品中文字幕无码l| 久久久国产精品亚洲精品| 亚洲av影音先锋| 国产精品禁久久久精品| 丁香五月婷婷基地| 国产精品精品系列在线观看| 大香伊人在线一区| 熟女色综合久久| 凹凸 69堂 在线播放| 67914亚洲精品| 亚欧高清| 日夜尻逼网| 资源在线观一 二| 国产精品永久免费10000| 97国产综合欧美| 中文字幕在线播放2中文字幕在线观看2| 美女91网站| 中文一区在线日| 激情色色| 操逼视频国产无套| 熟妇一区,二区,三区。| 日本免费一区二| 凸凹视频在线观看| 亚洲欧美综合| 黑人综合色| 91九九九馒头| 综合欧美日本三级| 国产精品久久久吖| 91黄射| www.高清无码诱惑一区.com | 午夜毛片高清免费不卡| 91熟女.com| 亚洲天堂性爱| 国产一区二区啪啪视频| 青娱乐老司机视频| 男人的天堂com| 中文字幕78| 乱人伦 国语对白:视频直接看| 成人无码在线视频网站| 欧美亚洲在线| 欧亚日韩综合精品国产| 搡老女人老妇女老妇老熟女怎么读| 色噜噜精品一区二区三| 草草电影院| 97久久超碰日韩精品| 日韩欧亚中文在线| 国产怡红院| 五月综合激情| 亚洲精品无码少妇久久| 国产美女口爆吞精视频| 欧美一二三| 88在线一区二区三区| 欧美猛交黑寡妇中文字幕| 亚洲欧洲偷拍一区| 狠狠狠狠狠狠| 亚洲各类熟们中文字幕| 五月丁香色综合| 亚州色阁| 目产99999久久999| 99999精品视频| 久久婷婷五月综合| 亚洲精品无码少妇久久| 综合欧美激情网| 99视频这有这里有精品| 亚洲自拍偷拍视频在线| 亚洲久9| 亚洲少妇综合| 91少妇高潮| 高清无码学生妹高潮| 男人的天堂日韩| 后入式视频国产自| 九九九九九用不成了| 97超碰色屌| 色哟哟 日韩精品| 国产综合久久久鬼色| 啊…啊…操我用力操我| 色九九综合| 成年女人18级毛片毛片免费观看| 国产精品一区二区 尿失禁| 人妻 中文 日韩| 干日本人少妇午夜寂寞影院| 欧美大香蕉同搞| 中文字幕中文字幕一区二区| 一区二区三区黄色片a| 高清国产性猛交xxxx乱大交| 国产精品区在线12p| 天天操天天射天天日| 欧美性爱第一区| 国产成人免费观看在线视频 | 天天日日舔舔| 综合国产97| 97视频在线观看高清资源| 日本99一区二区| 国产九九九九九九九九| 亚洲成人福利电影免费| 免费在线观看国内色片网站网址| 亚欧国产无码精品在线| 丁香五月天啪啪| 人妻天天操天天爽视频免费| 色老汉色| 欧美国产操逼| 国产路线专区| a片 xxxx受爽视频| 亚洲第一免费视频| 爱媛媛久久国产福利| 在线观看AV不卡| 国产乱弄免费在线视频。| 色综合99999| 不卡视频一区蜜桃视频| 中文字幕精品免费一区二区| 日韩黄色一区二区三区| 激情一区二区三区在线观看| 秋霞男人网| 蜜桃臀一区二区三区久久| 97在线视频免费观看| av绯色| 五月丁香狠狠爱| www.99热在线只有精品| 夜夜精品视频一区二区| 色在线视频导航| av凤凰久久久| 久久久久久久78| 久久久天美| 欧美性爱另类综合| 狠狠久久亚洲欧美专区| 伊人 俄罗斯 a v| 蜜臀中文字幕| 五月天丁香婷婷综合网站| 精品久久一区二区三区四区五区| 操B久久| 麻豆天美在线| 亚洲阿v天堂无码z2018| 人妻加勒比东京热| 日本亚欧爱爱| 熟妇的味道HD中文字幕| 婷婷久久综合| 日韩人妻精品| 一二三四视频中文字幕在线看| 亚洲日本成人动漫| 黑人综合色| 国产乱伦性爱区| 色爽爽文学| 亚洲熟女少妇免费视频| 99视频这有这里有精品| 97亚洲国产影视| 亚洲第一视频 欧美风情 日韩| 中文字幕,人妻,日韩| 国产乱码久久| 精品国产乱码久久久久久免费| av天堂精品久久| 夜夜操av亚洲一区二区| 美女91| 五月丁香色情| 91熟女视频网| 囯产操逼片| 东京热大香焦| 精品人妻一区二区视频| 艾草av| 日本色色色网站免费看不卡| 五月天婷婷影院| 91精品导航| 久久怡红院| 亚洲少妇视频| 97人人射| 国产一二三福利视频网| 中字乱伦AV| 日本一二三免费久久| 99热这里只有精品地址 | 久久神马| 97色在线观看| aaa亚无码专区| 欧美激情视频一区二区三区不卡| 欧美综合第一页| 中亚av| 丝袜美腿亚洲| 久久25| 国产v片在线免费观看| 天天综合欧美综合| 亚洲 欧美 制服 另类 自拍| 怡红院久久老司机| 国产一区二区三区白丝| 97 超碰 人人做 人人爱| 国产精品麻豆成人av| 9热9热综合网| 飘花国产午夜精品不卡| 二三四区精品| 欧美视频边做饭边橾| 熟妇一区,二区,三区。| 国模精品一区二区三区苹果色戒| 97在线免费公开视频| 色色色综合| 熟妇乱伦一区二区| 美女啪欧美一区| 欧美极品性爱天天射| 亚洲日韩黑丝| 久久香蕉国产传媒一区剧情天美| 97精品视频| 欧洲亚洲人妻无码中字久久三区四区| 日本熟女免费視颖| 婷婷五月天色网| 青青青操| 天天综合网日韩7799| 欧美综合综合| 久草精品热视| 国产成人一级av88| 密臀在线视频| 欧美日日夜夜| 91小视频| 欧美色999| 亚洲精品蜜桃久久久久久久| 九九人人操| yaouchengrenav| 午夜综合在线| 中文字幕老熟妇黄色视频| 亚欧毛片基地国产毛片基地| 色欲久久99精品久久| 欧美日韩国产中文精品字幕自在自线, | 亚洲第一视频 欧美风情 日韩| 香蕉在线一区二区三区| 女同女同恋久久级三级| 噜噜噜噜久久久精品免费| 日韩国产十八禁| 久久丁香五月婷婷| 欧美一二三级精品在线| 操高情无码| 女生91网站| 超碰97在线色男人??| 久久久久13| 九一精品牛牛一区二区| 亚洲欧美国产其他二区| 日韩三级av片| 大香蕉欧美国产日韩高潮| 久久九九99| 日本天天操| 呦呦一区| 9精品久久久久| 欧美日韩亚洲五月天婷婷| 亚洲高潮少妇| 黄网色一区二区三区四区精品| 人人操人人摸人人骑| 九九九不卡| 亚州高清av| 丝袜天堂| 久久综合日韩亚洲欧美| 久久女婷| 99热这里只有精品地址| 日本欧美韩国国产在线| 91狠狠综| 97Ai亚洲| 日韩九九九| 久久久久深夜无码| 欧美大战久久久伊人| 国产人伦精品一区二区三区| 高清无码网址| 天天爱天天操| 激情综合婷婷| 在线性黄高清免费视频| 国产成人精品必看 | 色翁荡息又大又硬又粗又爽| 啊啊啊网站| 亚洲欧美色图片| 国产精品不卡少妇白| 福利五区| 女上位精品在线| 精品人妻一二三四区视频| 一区二区视频你懂的| 久久九九一区二区三区成人| 国产原创精品| www鬼畜国产男人的天堂| 久久久精品国产亚洲伊人| 亚洲天堂男人在线| 大香蕉免费中文| 先锋精品av色鲁| 亚洲激情网一二三四区| 国产在线76页| 色色色色色色色色色色色色色色综合 | 99色综合| 亚洲一区二区麻豆影院| 加勒比无码一区二区三区| 婷婷色综合| 大香蕉碰| 亚洲欧美中日韩| 啊啊啊啊操死我了| 成人天天爽| 天天综合网亚洲综合网| 色天天野狼综合社区| 欧美日韩欧美| 在线观看中文字幕| 国产精品国产亚洲区艳妇糸列| 亚洲无码精品AV久久久| 国产多人在线观看视频| 国产 日韩 欧美高清| 亚洲精品天堂久久A∨51成人漫 | 成人日本片久久久蜜桃| 老熟女天天操| 97干97色| 日本色色视频网站| 久久久久9999妇女| 97AV在线免费观看| 久久精品国产97欧美精品亚洲 | 国产福利电影| 伊人久久大香线蕉无码| 蜜臀AV网站| 丁香五月天婷婷姐| 粉嫩久久久久| 九九热精品| 看免费的黄片| 综合色啪| 中文字幕在线观看AV| 男人的天堂日本东京热| 一本色道熟妇| 91伊人久| 综合色色网| 成年男人的天堂| 97久久久久久久久久| 亚洲综合电影| 国产精品香蕉热久久新品| 亚洲综合网电影91| 亚洲日韩欧美一区二区| 亚洲人妻爽爽爽| 国产家庭乱伦性爱视频| 色婷婷综合视频| 91高跟美女在线播放| 熟人人妻少妇精品久久| 亚洲精品视频二区| 久久爱超碰网| 狠狠爱大香蕉| 综合久久六月久久婷婷| 97人肏| 嗯~啊~快点 死我视频免费看网站| 丝袜 中出 制服 人妻 美腿 中文字幕| 欧美操人视频| 成人日韩欧美| 自拍亚洲综合| 人妻少妇久久中文字幕一区二区 麻豆| 国产精品久久久久久久黄无码| 亚洲日产专区| 亚洲熟妇白浆无码AV| 秋霞一集毛片观看| 亚洲 欧美 日韩 国产一区二区| 久久久96| 99日精品欧美国产| 亚洲第一页欧美| 精品久久97| 国产尤物AV尤物在线观看不卡| 九九久久久久久爱| 亚洲人妻精品一区二区| 久久av成人无码免费| 日韩AV中文字幕电影| 欧美韩日精品99综合| 日日摸夜夜夜夜爽| 午夜久久一区二区无码中出| 丝袜美腿丝袜| 操逼逼福利视频| 九九九九九九九九九五码| 百度百度日本操逼| 人妻激情偷乱视频一区二区三区| 9ⅰ久久久天天| 91午夜无码| 欧美精品91| 草草电影院| 人人爽天天爽| 超碰人妻久久| 久久久久久人妻| 国产在线激情| 久热婷婷| 东北女人高潮视频| 99久久99九九99九九九| 久久超碰天天| 天天躁日日躁AAA片李宗瑞| 精品成人女人久久| 密乳无码| 免费久久一级毛片大黄| 欧美黑人性猛交91| 97在线观看免费视频| 伊人综合色网| 国产h小视频在线观看免费| 屌逼麻豆| 极品白嫩美少妇在地板上位骑射淫水泛滥| 志村玲子视频一区二区| 亚洲成成熟女人综合一区二区| 亚洲国产欧美中日韩成人综合视频| 麻豆精品三区视频| 色久桃花影院在线观看| 久久久精品一区二区| 国产精品宅男免费| 久久影视二区三区行押| 日本韩欧美在线播放a| 国产尤物在线三区| AV中文在线可看| 91精品国产91久久青草| 白丝AV网站| 国产一区二区三区视频在线看| 亚洲色图 综合| 五月丁香社区婷婷日韩欧美精品影院 | 99精品视频在线观看免费| 久久偷偷色综合蜜桃| 九九黄色视频在线观看| 欧美日韩小说| 六月婷激情福利天堂69| 国产91会所女技师在线观看| 国产十八禁视频| 粉嫩在线一区二区懂色| 熟女人妻一区二区三区| 亚洲欧美中日韩| 欧美国产精品| 人妻久久| 亚洲影院小综合| 日本精品不卡一二三区| 中文字幕在线免费观看 | 中亚黄色三级大片 | 亚洲激情视频| 四虎国产成人精品免费一女五男| www.91理论| 亚欧美综合网| 五十路熟女工口 | 亚州欧美在线| 国产福利夜| 高清在线偷拍自拍视频| 日本操逼视频在线| 夜夜免费视频| 狠狠 91| 乱论91| 天天草天天日| 四虎免费视频| 午夜福利久久久噜久噜久久综合| 国产乱人伦AVA麻豆软件.| 亚洲色图欧美激情| 97超碰超欧美。| 亚洲 中文 女同| 国产亚洲日本精品在线| 中文字幕在线观看网址| 国产熟女自拍| 婷婷五月天久久精品视频一区二区三区| 欧美午夜视频精品久久| 色色毛片| 97久久超碰亚洲| 东北老女人的激情视频| 操久久久久久| 强奸乱伦大香蕉网| 日韩精品中文字幕人妻| 精品视频一区二区| 欧美 牲| 亚洲免费精品一区| av在线资源| 可能人人看人人摸| 亚洲一级黄色毛片| 啪啪自拍九九综合| 大香蕉操久久| 亚洲天天做日日做天天谢日日| 自偷自拍的亚洲视频| 久久人妻无码毛片A片麻豆| 久久久久久久唑| 91狠狠综合久久久久久| 不卡六六在线91| 日本免费专区| 久久成人东京热人妻| 亚洲欧洲国产综合av| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 国产大学生口爆吞精合集| 东北女人的毛片| 伊人操你| 欧美色色人| 人妻久久久| 天天干天天操天天操夜夜操天天操| 九九热男人天堂| 正在播放国产精品一区| 亚洲色图伊人网| 99超级碰免费视频| 亚洲熟女乱色一区二区三区久久久| 91+欧美| 亚洲少妇中文字幕网址| 男人的天堂免费| 亚洲棕合电彰| 国产福利第一视频| 日本色色色网站免费看不卡| 99re只有精品| 日本熟妇一区二区三区| 不卡av在线中文字幕| 欧综合网| 欧美性生活内射| 熟女日韩| 欧美精品日韩一区二区| 乱性AV| 欧美第一页| 91中文字幕在线观看| 欧美精品三区| 欧美在线伊人色| 亚洲色图91欧美日韩| 亚洲欧美中文日韩视频中国语| 中国AV美女| WWW操逼| 国产极品粉嫩馒头一线天av| 欧美在线啊啊|