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

ARTICLE DETAIL

資訊詳情

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

C++零成本抽象:從原理到實(shí)戰(zhàn)的全面解析

C++零成本抽象:從原理到實(shí)戰(zhàn)的全面解析 1. 不止是一句口號零成本抽象的準(zhǔn)確含義與常見誤讀1.1 兩條鐵律到底在說什么零成本抽象這個(gè)概念源自 C 之父在《The C Programming Language》里那段經(jīng)典論述大意是你不需要為沒用到的功能付出代價(jià)而用到的功能也沒法做得更好。這句話常被愛好者復(fù)述但真把它落到工程實(shí)踐里很多人其實(shí)沒有完全吃透。先拆開看。第一條“不為沒用的東西付費(fèi)”相對好理解。C 的標(biāo)準(zhǔn)庫容器、智能指針、lambda、模板這些都是抽象工具但如果你在代碼里一個(gè)都不用編譯器不會(huì)強(qiáng)制你背負(fù)任何相關(guān)開銷。一個(gè)只做整數(shù)加法的循環(huán)在 C 里編譯出來的指令跟 C 語言手寫版本不會(huì)有實(shí)質(zhì)差別你不需要為一個(gè)沒用到的 std::vector 付出哪怕一個(gè)字節(jié)的運(yùn)行時(shí)成本。這一點(diǎn)讓 C 在“抽不抽象”這件事上比那些運(yùn)行在虛擬機(jī)、帶 GC、或者強(qiáng)制啟用反射機(jī)制的語言要靈活得多。第二條“用到的也沒法做得更好”才是真正苛刻的要求。它意味著編譯器給你生成的東西理論上應(yīng)該約等于手寫最優(yōu)實(shí)現(xiàn)。比如你寫了一個(gè)模板函數(shù)做兩個(gè)數(shù)的比較編譯器針對具體類型實(shí)例化之后生成的機(jī)器碼應(yīng)該和一個(gè)手寫函數(shù)等價(jià)不會(huì)因?yàn)椤斑@是模板”而多套一層任何東西。這條規(guī)則不是空話它直接約束了標(biāo)準(zhǔn)庫的設(shè)計(jì)——比如 std::sort 用的是內(nèi)聯(lián)比較器而不是像 C 的 qsort 那樣傳入函數(shù)指針。庫作者寧可讓比較器成為模板參數(shù)、哪怕是傳一個(gè)默認(rèn)的 lambda也不會(huì)強(qiáng)迫你在運(yùn)行期通過函數(shù)指針做間接調(diào)用因?yàn)槟菚?huì)破壞第二條鐵律。這里要著重提醒一個(gè)常被誤解的點(diǎn)零成本抽象不是“編譯器一定幫你優(yōu)化掉一切”。它是語言層面的設(shè)計(jì)哲學(xué)和庫作者的約束而不是優(yōu)化器的承諾。你寫的抽象如果本身設(shè)計(jì)得有運(yùn)行時(shí)開銷比如沒有內(nèi)聯(lián)的策略類、濫用虛函數(shù)、或者復(fù)制了本可以移動(dòng)的大對象那這個(gè)成本是實(shí)打?qū)嵉臎]人替你抹平。零成本抽象更像是一種“上限可達(dá)”的承諾如果你按規(guī)則使用抽象理論上你寫出來的東西能和手寫代碼一樣快但是否真的“一樣快”還要看你是否踩中了優(yōu)化器的盲區(qū)以及你是否錯(cuò)誤地引入了不必要的間接層。1.2 “抽象”與“間接”之間隔著一層什么我們常把“零成本抽象”理解成“零成本的多態(tài)”或“零成本的接口”這在方向上是對的但容易把“抽象”這個(gè)詞本身浪漫化。抽象的本質(zhì)是掩蓋細(xì)節(jié)你調(diào)用 std::sort 時(shí)不用關(guān)心內(nèi)部是快排還是堆排的切換你把元素扔進(jìn) std::vector 時(shí)不用擔(dān)心內(nèi)部是如何倍增擴(kuò)容的。這些細(xì)節(jié)被封裝了于是你的心智負(fù)擔(dān)下降了。但“掩蓋細(xì)節(jié)”在機(jī)器層面總要付出某種代價(jià)。大多數(shù)語言的答案是在運(yùn)行期增加一層間接。函數(shù)指針、虛表跳轉(zhuǎn)、反射調(diào)用、解釋器分派都是間接。間接帶來靈活性但也帶來分支預(yù)測失敗、緩存不友好、無法內(nèi)聯(lián)等一系列問題。C 的思路完全相反把“掩蓋細(xì)節(jié)”這件事盡量挪到編譯期去完成。模板就是最好的例子。你在源碼層面見到的是一個(gè)泛化的 sort 模板對不同的迭代器類型、不同的比較器類型編譯器在編譯期會(huì)各自生成一個(gè)專用版本。類型和比較邏輯在編譯期就被解析完了運(yùn)行期就是一個(gè)純粹的、針對當(dāng)前類型優(yōu)化的循環(huán)。你用抽象了但你并沒有為抽象付出運(yùn)行期開銷因?yàn)殚_銷被轉(zhuǎn)嫁到了編譯期。這也是為什么我一直建議開發(fā)者判斷一段 C 代碼是否真正做到了零成本不要只看源碼長得是否優(yōu)雅而要自己動(dòng)手看編譯產(chǎn)物。抽象好與抽象快的區(qū)別恰恰就在于那一層間接有沒有被優(yōu)化器消化掉。之后我會(huì)專門講怎么用匯編對比來驗(yàn)證這一點(diǎn)。2. 模板與 constexpr把計(jì)算搬到編譯期的那把鏟子2.1 模板實(shí)例化是如何做到“按需生成”的模板是零成本抽象的基石因?yàn)樗凇邦愋途S度”上做代碼生成。你可能已經(jīng)在代碼里寫了幾百個(gè)模板函數(shù)但未必真正理解過實(shí)例化過程的細(xì)節(jié)。當(dāng)一個(gè)模板函數(shù)被調(diào)用時(shí)編譯器會(huì)按照實(shí)參類型去推導(dǎo)模板參數(shù)然后針對這一組具體類型生成一份真實(shí)的函數(shù)代碼。這個(gè)過程發(fā)生在語義分析和代碼生成階段也就是說模板本身不是一個(gè)能在機(jī)器上運(yùn)行的實(shí)體它只是一個(gè)“圖紙”每用一次就給一份對應(yīng)的機(jī)械加工圖紙。這個(gè)機(jī)制天然有零成本的屬性你定義一個(gè) template 的 min 函數(shù)如果你只在程序里用它比較 int那編譯器就只生成一個(gè) int 版本如果你又用它比較 double它再多生成一份 double 版本。你不需要為那些從來沒用過的類型付出代碼量、運(yùn)行時(shí)間或存儲(chǔ)空間。相比之下Java 的泛型在運(yùn)行期會(huì)有類型擦除和裝箱拆箱C 語言則根本沒有泛型只能用宏或 void*。宏在文本層面替換沒有類型檢查void* 則會(huì)引入指針間接和類型轉(zhuǎn)換的不安全。模板在“編譯期做完類型工作”這一點(diǎn)上確實(shí)把抽象成本和運(yùn)行時(shí)性能的平衡做到了一個(gè)很高的位置。但是模板的實(shí)現(xiàn)同樣有代價(jià)只是代價(jià)發(fā)生在編譯期。每多一個(gè)不同的實(shí)例化編譯器就要多做一遍類型推導(dǎo)、重載決議、語義檢查以及生成一份完整的函數(shù)體。這會(huì)導(dǎo)致兩個(gè)工程問題一是編譯時(shí)間隨模板實(shí)例數(shù)量的增長而明顯上升二是二進(jìn)制體積膨脹bloat特別是當(dāng)你對同一個(gè)模板傳入很多不同類型的時(shí)候。很多團(tuán)隊(duì)會(huì)發(fā)現(xiàn)引入大量模板元編程代碼后編譯時(shí)間從幾十秒漲到幾分鐘鏈接時(shí)符號去重和重命名也會(huì)變慢。這與“零成本抽象”并不矛盾——它說的是運(yùn)行期零成本不是編譯期零成本。你在運(yùn)行期節(jié)省的每一分錢本質(zhì)上都是拿編譯期的時(shí)間預(yù)支出來的。2.2 constexpr讓函數(shù)在編譯期就被“執(zhí)行”constexpr 系列特性是零成本抽象的另一個(gè)支柱。一個(gè) constexpr 函數(shù)理論上既可以運(yùn)行期調(diào)用也可以在編譯期被求值。C11 剛引入 constexpr 時(shí)限制非常多函數(shù)體只能是一條 return 語句。那時(shí)候?qū)懢幾g期計(jì)算就像在做腦筋急轉(zhuǎn)彎。到 C14 放開為允許循環(huán)和局部變量C17 加入 if constexprC20 又進(jìn)一步允許 constexpr 虛函數(shù)、try-catch、甚至 constexpr 分配內(nèi)存在有限條件下編譯期計(jì)算的表達(dá)能力已經(jīng)逼近普通函數(shù)。if constexpr 這個(gè)特性尤其值得聊聊。它是編譯期的條件分支編譯會(huì)根據(jù)模板參數(shù)或常量表達(dá)式在編譯期就確定走哪一條分支而沒被選中的分支根本不會(huì)被實(shí)例化。舉個(gè)例子假設(shè)你寫一個(gè)能同時(shí)處理整數(shù)和浮點(diǎn)數(shù)的數(shù)學(xué)工具函數(shù)模板參數(shù)是傳入的類型。用普通運(yùn)行時(shí) if 的話編譯器仍然需要把兩個(gè)分支都生成出來哪怕其中一個(gè)分支在當(dāng)前類型下永遠(yuǎn)不會(huì)執(zhí)行如果用 if constexpr編譯器只會(huì)為當(dāng)前類型生成匹配的分支另一個(gè)分支甚至連語法語義檢查都會(huì)少做很多。這種“寫在同一段代碼里卻按不同類型各取所需”的能力正是零成本抽象的典型形態(tài)你在源碼層面維護(hù)一份抽象代碼運(yùn)行期卻是各類型專用實(shí)現(xiàn)。constexpr 的實(shí)際價(jià)值不只是省掉幾次計(jì)算更重要的是把原來只能運(yùn)行期做的事提前到編譯期從而消除初始化階段的重復(fù)開銷。比如配置表的生成、CRC 查找表、位掩碼的預(yù)計(jì)算這些活兒完全可以交給 constexpr 函數(shù)在編譯期跑完運(yùn)行期拿到的就是一個(gè)已經(jīng)填好數(shù)據(jù)的數(shù)組。我自己做過的一個(gè)小項(xiàng)目里把一段用宏拼接出來的位掩碼生成邏輯改寫成了 constexpr 函數(shù)之后不光可讀性提升了而且因?yàn)槭∪チ诉\(yùn)行期初始化程序啟動(dòng)時(shí)間也節(jié)省了肉眼可見的一截。這就是零成本抽象在真實(shí)項(xiàng)目里“實(shí)打?qū)崱钡氖找妗?.3 static_assert 與類型萃取讓編譯期檢驗(yàn)成為你的護(hù)欄編譯期能力越強(qiáng)越有必要讓編譯器幫我們做驗(yàn)證。static_assert 是零成本抽象實(shí)踐里一個(gè)常被低估的工具。它能在編譯期斷言一個(gè)常量表達(dá)式的真?zhèn)稳绻麠l件不成立編譯直接失敗。它的強(qiáng)大之處在于你不需要等程序跑起來、再靠運(yùn)行時(shí)日志或斷點(diǎn)去發(fā)現(xiàn)類型不匹配或假設(shè)被破壞的問題。所有檢查發(fā)生在編譯期不會(huì)往運(yùn)行期增加任何指令。配合類型萃取type traits你可以寫出非常嚴(yán)格的編譯期約束。比如要求模板參數(shù)必須是整數(shù)類型可以在模板體開頭寫 static_assert(std::is_integral_v , T must be integral); 編譯時(shí)一旦有人誤用報(bào)錯(cuò)信息會(huì)直接指明問題而不是在層層實(shí)例化錯(cuò)誤里讓人猜。C20 引入了 concepts雖然表達(dá)能力更強(qiáng)、報(bào)錯(cuò)更友好但對很多存量項(xiàng)目來說遷移成本并不小在維護(hù)老代碼時(shí)static_assert 加 type traits 仍然是性價(jià)比極高的方案。我還想提一個(gè)實(shí)戰(zhàn)技巧如果擔(dān)心模板函數(shù)在某組類型下被默默實(shí)例化出低效的代碼可以借助編譯器的特定警告或靜態(tài)分析工具來檢查。比如 clang 的 -Wunused-template 和某些靜態(tài)分析插件能幫你找出那些被實(shí)例化但從未真正使用的模板分支。零成本抽象要求“沒用到的不付出代價(jià)”而“用到了但根本沒被跑到的代碼”往往就是這種代價(jià)的來源——它們擠占指令緩存拖慢加載時(shí)間但實(shí)際執(zhí)行時(shí)可能完全繞開。這類問題在大型代碼庫里非常隱蔽卻可以通過工具和編譯期斷言做成“顯式約束”讓偏離去設(shè)計(jì)意圖的代碼在合入階段就被攔下來。3. 運(yùn)行期多態(tài)的成本賬虛函數(shù)、異常與 RTTI 的隱性清單3.1 vtable 的兩次間接和一次挫敗的內(nèi)聯(lián)要說清楚零成本抽象就必須把它的對立面也講明白運(yùn)行期多態(tài)為什么“有成本”以及成本具體在哪兒。虛函數(shù)是 C 里最典型的運(yùn)行期多態(tài)。一個(gè)類只要聲明了 virtual 函數(shù)編譯器就會(huì)給這個(gè)類的對象插入一個(gè)隱藏的虛表指針vptr。每次調(diào)用虛函數(shù)時(shí)運(yùn)行期要做兩步操作先通過對象的 vptr 定位到虛函數(shù)表vtable再從表中取出對應(yīng)函數(shù)的地址然后進(jìn)行間接調(diào)用。這兩次間接操作本身在現(xiàn)代 CPU 上通常只值幾個(gè)周期。真正的問題在于它破壞了優(yōu)化器的能力。第一間接調(diào)用讓編譯器無法內(nèi)聯(lián)。你寫得再漂亮的、只有三行邏輯的虛函數(shù)一旦通過虛函數(shù)表去調(diào)編譯器就無法把它的函數(shù)體嵌入到調(diào)用點(diǎn)于是每次調(diào)用都要經(jīng)歷完整的函數(shù)調(diào)用開銷參數(shù)傳遞、棧幀管理、返回地址保存。第二間接跳轉(zhuǎn)會(huì)干擾分支預(yù)測器。高性能循環(huán)里如果每條迭代都要做一次 unpredictable 的間接跳轉(zhuǎn)流水線停頓的代價(jià)會(huì)被放大得極其明顯這可比“多執(zhí)行兩條指令”昂貴得多。在我參與過的某個(gè)模擬項(xiàng)目中一個(gè)熱循環(huán)內(nèi)部有狀態(tài)對象的多態(tài)更新操作。最初所有狀態(tài)類型都繼承自一個(gè)虛基類每幀要調(diào)用幾百次虛函數(shù)。后來我把這處多態(tài)改為模板 std::variant 的靜態(tài)分派在完全相同的功能邏輯下單幀時(shí)間大約下降了三成。這不是說虛函數(shù)“一定慢”而是說在緊循環(huán)這種優(yōu)化器尤其敏感的上下文里虛調(diào)用帶來的代價(jià)會(huì)從“幾個(gè)周期”演變成“無法忽視的比例”。3.2 異常機(jī)制與 RTTI那筆你可能沒算過的“倉儲(chǔ)費(fèi)”異常exception是另一個(gè)常被拿來討論“成本”的特性。早期 C 異常實(shí)現(xiàn)為了追求小對象體積采用類似 setjmp/longjmp 的機(jī)制但代價(jià)是運(yùn)行期每進(jìn)入一個(gè)函數(shù)就要注冊上下文速度慢得驚人。現(xiàn)代 Itanium ABI 的實(shí)現(xiàn)改成了“表驅(qū)動(dòng)”在沒有異常被拋出的正常路徑上異常處理幾乎是零成本的——編譯器不會(huì)額外插入檢查指令。只有當(dāng)異常真正被拋出的那條路徑運(yùn)行期才會(huì)去查展開表、做?;赝恕⑵ヅ?handler。所以現(xiàn)代 C 異常的成本模型是正常路徑零成本異常路徑高成本。這就引出一個(gè)實(shí)際建議異常適合用來處理那些真正“異?!钡那闆r比如資源獲取失敗、不可恢復(fù)的錯(cuò)誤不適合用在熱路徑里作為流程控制。你如果在一個(gè)每秒調(diào)用幾萬次的函數(shù)里 try-catch即使不拋出異常棧展開表的存在也會(huì)輕微增加函數(shù)體所在區(qū)域的代碼密度影響指令緩存。而且啟用異常還會(huì)讓鏈接產(chǎn)物里帶上類型匹配信息和展開表二進(jìn)制體積會(huì)變大。很多嵌入式項(xiàng)目選擇關(guān)閉 -fno-exceptions不是因?yàn)樗麄儾恍枰e(cuò)誤處理而是因?yàn)閷τ谒麄儊碚f異常這棵大樹的“倉儲(chǔ)費(fèi)用”不值得為偶爾一用的錯(cuò)誤路徑買單。RTTI 的成本與此類似。typeid 和 dynamic_cast 需要編譯器為帶多態(tài)類型的對象維護(hù)額外的類型信息。dynamic_cast 還涉及沿著繼承層次運(yùn)行期搜索雖然多數(shù)情況是走偏移計(jì)算而非暴力遍歷但比起靜態(tài)類型轉(zhuǎn)換仍然有可感知的開銷。更重要的是RTTI 會(huì)阻止某些優(yōu)化比如堆棧復(fù)用和對象布局的極致壓縮。這也就不難理解為什么很多追求極致性能的庫會(huì)把 RTTI 關(guān)閉同時(shí)自己實(shí)現(xiàn)一個(gè)輕量的類型標(biāo)識(shí)方案比如用整數(shù) ID 或者枚舉來表示類型類別。3.3 該用虛函數(shù)還是靜態(tài)分派的判斷準(zhǔn)則那么是不是只要是嘔心瀝血做性能的項(xiàng)目就永遠(yuǎn)不該用虛函數(shù)也不是。虛函數(shù)的靈活性和擴(kuò)展性很多時(shí)候是靜態(tài)分派給不了的。我的判斷準(zhǔn)則大概有三條。第一對象的類型是否真的在運(yùn)行期變化。如果從用戶輸入、配置或者插件加載中讀到的是不同類型動(dòng)態(tài)創(chuàng)建后需要以統(tǒng)一接口操作那虛函數(shù)幾乎是自然選擇。反之如果所有類型在編譯期就能確定就應(yīng)當(dāng)優(yōu)先考慮模板、重載或 variant 來實(shí)現(xiàn)編譯期多態(tài)。第二調(diào)用點(diǎn)是否處于熱路徑。如果這個(gè)虛調(diào)用每天只在初始化階段發(fā)生一次或者在低頻率的 UI 事件回調(diào)里發(fā)生那哪怕多付一點(diǎn)間接調(diào)用開銷也無所謂??扇绻趲h(huán)、消息循環(huán)或數(shù)值計(jì)算內(nèi)層就必須三思。第三是否需要二進(jìn)制的可擴(kuò)展性???DLL、跨 SO 導(dǎo)出的接口或需要讓用戶在不重新編譯核心庫的前提下加入新的派生類這類場景必須保留虛函數(shù)。因?yàn)槟0搴挽o態(tài)分派需要在編譯期看到所有類型信息在二進(jìn)制邊界上寸步難行。在這里“零成本”需要讓位于“接口的可演化性”這是合理的設(shè)計(jì)取舍不是性能上的失敗。重要的是把決策做成顯式的。我見過很多項(xiàng)目的虛函數(shù)并不是設(shè)計(jì)者深思熟慮后的選擇而是“類的繼承體系天然這樣寫了”。如果你在 code review 時(shí)看到關(guān)鍵循環(huán)里有虛調(diào)用我都會(huì)問一個(gè)問題這里能不能用編譯期分派替代這不意味著一定要改但至少要把那筆成本賬算明白。4. 從手寫循環(huán)到 std::views更抽象、更零成本的現(xiàn)實(shí)范例4.1 手寫循環(huán)與標(biāo)準(zhǔn)庫算法的編譯產(chǎn)物比對零成本抽象最容易講明白的例子是標(biāo)準(zhǔn)庫算法。假設(shè)你要把一組整數(shù)做平方再求和手寫版本可能是int sum_of_squares(const std::vectorint v) { int s 0; for (size_t i 0; i v.size(); i) { int x v[i]; s x * x; } return s; }換成標(biāo)準(zhǔn)庫算法int sum_of_squares(const std::vectorint v) { return std::accumulate(v.begin(), v.end(), 0, [](int acc, int x) { return acc x * x; }); }很多初學(xué)者擔(dān)心第二種寫法“更抽象、更慢”。如果你在 -O2 下分別編譯上面兩個(gè)函數(shù)把匯編攤開對比會(huì)發(fā)現(xiàn)指令序列幾乎是一樣的同樣從內(nèi)存加載數(shù)據(jù)、乘方累加、處理循環(huán)邊界。lambda 在這里是個(gè)無狀態(tài)類型編譯器將其內(nèi)聯(lián)成普通函數(shù)對象不會(huì)生成函數(shù)指針調(diào)用。這就是“零成本抽象”最直白的證明抽象只是改變了源碼的組織形式?jīng)]有改變最終機(jī)器碼的本質(zhì)。我建議大家自己動(dòng)手做一次這個(gè)實(shí)驗(yàn)因?yàn)椤把垡姙閷?shí)”比任何理論解釋都有說服力。你不需要什么特殊環(huán)境一個(gè)安裝了 g 或 clang 的 Linux 終端就行也可以用在線編譯器快速對比不同編譯器、不同優(yōu)化級別下的輸出。我在瀏覽器里反復(fù)對比過手寫循環(huán)、std::accumulate、std::for_each 以及 C23 的 std::ranges::fold_left 很多次多數(shù)情況下它們在高優(yōu)化級別下會(huì)趨同到幾乎一模一樣的匯編。如果哪次看到明顯的差別通常是因?yàn)槟阍谘h(huán)體里意外觸發(fā)了非內(nèi)聯(lián)調(diào)用——比如調(diào)用了虛函數(shù)或某個(gè)未內(nèi)聯(lián)的庫函數(shù)。4.2 views 的懶求值機(jī)制沒有中間容器也沒有中間開銷C20 的 std::views 是零成本抽象在標(biāo)準(zhǔn)庫層面最閃亮的實(shí)踐之一。它提供的 filter、transform、take 等適配器不是返回一個(gè)新容器而是返回一個(gè)輕量的 view 對象。這個(gè)對象內(nèi)部記錄的是迭代器、引用和轉(zhuǎn)換函數(shù)不擁有數(shù)據(jù)。真正的“過濾映射”邏輯被展開成一個(gè)嵌套的迭代器鏈當(dāng)你遍歷它時(shí)每一次迭代才觸發(fā)相應(yīng)適配器的計(jì)算。舉例來說auto result data | std::views::filter([](int x) { return x % 2 0; }) | std::views::transform([](int x) { return x * 3; });這段代碼不會(huì)創(chuàng)建任何臨時(shí)容器也不會(huì)預(yù)先過濾和變換出一個(gè)新數(shù)組。管道里的每一條適配器只是在構(gòu)造一個(gè)類型這個(gè)類型在運(yùn)行期會(huì)被內(nèi)聯(lián)為零成本或者近似零成本的迭代操作。實(shí)際執(zhí)行中過濾器決定當(dāng)前元素是否放行變換器在通過后立即應(yīng)用整個(gè)過程和你手寫一個(gè)帶 if 的循環(huán)一樣緊湊。用生活化的類比普通容器方案是先準(zhǔn)備一桌菜再請你吃view 方案是請一位廚師在你點(diǎn)菜時(shí)現(xiàn)場做——但這位廚師“內(nèi)聯(lián)”得非常好上菜速度和預(yù)先做好的幾乎一樣。這里的關(guān)鍵好處之一是你無需承擔(dān)容器分配的堆內(nèi)存、拷貝和釋放尤其是在大數(shù)據(jù)集、鏈?zhǔn)阶儞Q的場景下省下的不僅是時(shí)間還有內(nèi)存抖動(dòng)。當(dāng)然view 也不是完全沒有需要注意的地方。它保存的是迭代器和引用不能長期持有否則一旦底層容器被修改或析構(gòu)view 就懸空了。還有一個(gè)使用上的坑是 transform 中的 lambda 如果捕獲了大量狀態(tài)或者沒有標(biāo)記為內(nèi)聯(lián)友好編譯器可能無法完全折疊導(dǎo)致性能劣化。但在正確使用的前提下std::views 的抽象表達(dá)力與運(yùn)行期性能可以并存。4.3 驗(yàn)證零成本的標(biāo)準(zhǔn)姿勢讀匯編、看循環(huán)體如果你真的想判斷一段抽象代碼是不是零成本最可靠的方法不是猜而是讀編譯產(chǎn)物的匯編。完整流程大致是這樣把你要驗(yàn)證的函數(shù)放到一個(gè)單獨(dú)的文件里用 -O2或你項(xiàng)目實(shí)際使用的優(yōu)化等級編譯然后查看目標(biāo)平臺(tái)的匯編輸出g -stdc20 -O2 -S test.cpp -o test.s生成 test.s 后定位到對應(yīng)函數(shù)的符號檢查它內(nèi)部的指令。關(guān)注三件事循環(huán)體內(nèi)是否有函數(shù)調(diào)用指令call是否有額外的內(nèi)存讀寫比如加載函數(shù)指針、虛表指針是否有異常處理相關(guān)的展開表或類型檢查。在一個(gè)理想的零成本抽象版本中循環(huán)體應(yīng)該只有內(nèi)存加載、算術(shù)運(yùn)算、比較和跳轉(zhuǎn)。這并不是要每個(gè)人都成為匯編專家。我自己的經(jīng)驗(yàn)是即使讀不太懂每條指令你也能通過一些線索做出判斷。比如循環(huán)體里是否出現(xiàn)了間接跳轉(zhuǎn)jmp *%rax或間接調(diào)用call *%rax這通常意味著有虛函數(shù)或函數(shù)指針在“搗亂”再比如循環(huán)體是否比預(yù)想的長很多那可能說明你的 lambda 沒有被內(nèi)聯(lián)。很多在線工具提供了高亮和對比功能把抽象版本和手寫版本并排擺在一起差異幾乎一目了然。讀匯編還有一個(gè)額外的好處它能讓你對編譯器的優(yōu)化能力產(chǎn)生更準(zhǔn)確的直覺。你會(huì)發(fā)現(xiàn)現(xiàn)代優(yōu)化器對簡單 lambda、迭代器解引用、整型運(yùn)算的優(yōu)化相當(dāng)激進(jìn)很多時(shí)候你的“優(yōu)雅抽象”真的可以和手寫代碼一樣快。這種直覺會(huì)讓你在設(shè)計(jì) API 時(shí)更大膽地使用抽象而不是因?yàn)闊o端的性能焦慮而退回重復(fù)的樣板代碼。5. 編譯器優(yōu)化與鏈接期優(yōu)化零成本抽象的天花板在哪里5.1 內(nèi)聯(lián)、跨編譯單元優(yōu)化與 LTO 的作用邊界零成本抽象最終要落地靠的是編譯器的優(yōu)化。內(nèi)聯(lián)是最基礎(chǔ)的優(yōu)化抓手把函數(shù)體在調(diào)用點(diǎn)展開省去函數(shù)調(diào)用開銷。模板和 lambda 之所以能做到零成本核心就是它們的函數(shù)體在編譯期可見編譯器有完全的信息做內(nèi)聯(lián)決策。普通函數(shù)也可以內(nèi)聯(lián)前提是調(diào)用方和被調(diào)用方在同一個(gè)編譯單元里或者聲明了 inline。但有一個(gè)事實(shí)常被忽略內(nèi)聯(lián)是編譯器基于啟發(fā)式做的決策不是“聲明了 inline 就一定內(nèi)聯(lián)”。inline 關(guān)鍵字在現(xiàn)代編譯器中更多是“允許內(nèi)聯(lián)”的品牌而不是“強(qiáng)制內(nèi)聯(lián)”的命令。真正的強(qiáng)制內(nèi)聯(lián)通常要靠語言擴(kuò)展比如attribute((always_inline)) 或者 MSVC 的 __forceinline。如果函數(shù)體過大或者調(diào)用點(diǎn)過于復(fù)雜編譯器會(huì)自行決定不內(nèi)聯(lián)。如果你的抽象依賴“一定會(huì)內(nèi)聯(lián)”這個(gè)前提最穩(wěn)妥的做法是保持函數(shù)體足夠短小、邏輯足夠直接讓編譯器的內(nèi)聯(lián)啟發(fā)式無話可說。跨編譯單元的內(nèi)聯(lián)就更加微妙。設(shè)想你有個(gè)模板函數(shù)在一個(gè) .h 里定義和聲明都齊全那任何包含該頭文件的 .cpp 都能看到完整的函數(shù)體內(nèi)聯(lián)自然發(fā)生。但如果你把一個(gè)非模板的昂貴函數(shù)放在 a.cpp 里在 b.cpp 中調(diào)用即使加了 inline編譯器在 a.cpp 的單獨(dú)編譯中也看不到 b.cpp 的調(diào)用場景無法做跨文件的優(yōu)化。這時(shí)候鏈接期優(yōu)化LTO就登場了它在鏈接階段把整個(gè)程序的目標(biāo)文件合并進(jìn)行跨編譯單元的優(yōu)化讓那些原本被邊界擋住的內(nèi)聯(lián)和常量傳播得以實(shí)現(xiàn)。啟用方式在 GCC/Clang 里是編譯和鏈接都加 -flto。我在項(xiàng)目里遇到過一個(gè)典型場景一個(gè)日志格式化函數(shù)定義在公共庫中因?yàn)橛写罅糠种袛鄦挝募幾g時(shí)無法被調(diào)用方內(nèi)聯(lián)導(dǎo)致日志禁用時(shí)仍要付出函數(shù)調(diào)用的基礎(chǔ)成本。打開 LTO 后鏈接器在公共庫的調(diào)用點(diǎn)直接看到函數(shù)體判斷“日志級別關(guān)閉時(shí)整個(gè)格式化邏輯都不需要”一次性修剪掉了整段代碼。這個(gè)優(yōu)化在開啟 LTO 之前是做不到的。5.2 RVO、NRVO 與移動(dòng)語義拷貝消除也是零成本抽象的一部分移動(dòng)語義和返回值優(yōu)化RVO其實(shí)也屬于“零成本抽象”的討論范疇——它們解決的是“抽象返回對象時(shí)不產(chǎn)生拷貝成本”的問題。在 C11 之前一個(gè)函數(shù)返回復(fù)雜對象往往要觸發(fā)拷貝構(gòu)造成本很高。C11 引入移動(dòng)構(gòu)造之后你可以把資源從臨時(shí)對象“搬”到目標(biāo)對象通常只是一個(gè)指針交換或成員竊取代價(jià)極低。C17 更是強(qiáng)制規(guī)定了保證拷貝消除guaranteed copy elision在特定場景下返回純右值初始化對象編譯器連移動(dòng)構(gòu)造都不需要生成直接在目標(biāo)存儲(chǔ)上構(gòu)造對象。很多開發(fā)者沒有意識(shí)到的是寫代碼的方式會(huì)影響這些優(yōu)化能否生效。比如返回局部變量時(shí)如果你寫成std::vectorint make_data() { std::vectorint result {1, 2, 3}; return result; }編譯器在 C17 下大概率會(huì)執(zhí)行 NRVO命名返回值優(yōu)化直接把 result 構(gòu)造在調(diào)用方的存儲(chǔ)位置不產(chǎn)生移動(dòng)。但如果你把返回拆成兩步或讓對象在中途被放進(jìn)某個(gè)容器再取出來優(yōu)化就會(huì)被打斷。我在 review 時(shí)經(jīng)??吹接?std::move 強(qiáng)行搬移返回值的情況多數(shù)時(shí)候這反而會(huì)抑制 RVO——因?yàn)榫幾g器看到 move 后認(rèn)為你可能需要“移動(dòng)后的狀態(tài)”進(jìn)而不去做命名返回值優(yōu)化。移動(dòng)語義的另一個(gè)實(shí)踐要點(diǎn)是一個(gè)類只有設(shè)置了移動(dòng)構(gòu)造和移動(dòng)賦值才能在容器重新分配、算法排序等場景中享受到這些優(yōu)化。如果你定義的類有自定義析構(gòu)函數(shù)但沒有顯式聲明移動(dòng)構(gòu)造函數(shù)編譯器不會(huì)隱式生成移動(dòng)構(gòu)造轉(zhuǎn)而退回到拷貝構(gòu)造這正是很多代碼“明明用了 C14 卻還是慢吞吞”的原因之一。定義類時(shí)要么明確遵循“五法則”聲明或刪除拷貝/移動(dòng)/析構(gòu)要么干脆全部依賴默認(rèn)生成。5.3 優(yōu)化器的天花板代碼膨脹、編譯時(shí)間與不可見信息的約束零成本抽象并非沒有邊界。第一道邊界是二進(jìn)制體積。模板實(shí)例化越多代碼膨脹越明顯。如果你在多個(gè)編譯單元里用不同參數(shù)實(shí)例化同一模板鏈接器通常還是會(huì)做重復(fù)代碼合并但這個(gè)過程也有成本。當(dāng)模板函數(shù)很大、實(shí)例很多時(shí)整個(gè)可執(zhí)行文件會(huì)顯著變大指令緩存的壓力隨之上升。某些情況下一個(gè)“理論上零運(yùn)行成本”的模板實(shí)現(xiàn)因?yàn)橹噶罹彺嫜b載不友好實(shí)際性能反而不如一個(gè)緊湊但多一次間接調(diào)用的實(shí)現(xiàn)。這是零成本抽象一個(gè)非常隱蔽的反諷。第二道邊界是編譯時(shí)間。模板和 constexpr 的計(jì)算發(fā)生在編譯期如果大量使用尤其是模板元編程嵌套很深編譯期消耗會(huì)明顯延長。持續(xù)集成里每次構(gòu)建多花十分鐘團(tuán)隊(duì)成員的心情和效率都會(huì)受影響。很多項(xiàng)目筑起厚重的預(yù)編譯頭或模塊層就是為了緩解這個(gè)問題。C20 的 modules 有望改善模板頭文件重復(fù)解析的開銷但在大規(guī)模落地之前編譯時(shí)間仍然是零成本抽象“預(yù)支成本”的主戰(zhàn)場。第三道邊界是信息的不可見性。零成本依賴完整類型信息和函數(shù)體可見性。如果你的抽象函數(shù)在二進(jìn)制庫中調(diào)用方看不到實(shí)現(xiàn)就無從內(nèi)聯(lián)。這就是為什么高性能庫幾乎都是以 header-only 方式分發(fā)或者提供顯式實(shí)例化。理解了這一點(diǎn)你就明白為什么很多現(xiàn)代 C 庫寧可犧牲編譯期時(shí)間也要把實(shí)現(xiàn)完整暴露在頭文件里那是零成本的前提。6. 設(shè)計(jì)層面的靜態(tài)分派CRTP、策略類與“留一點(diǎn)運(yùn)行期”的智慧6.1 CRTP把繼承搬到編譯期的技巧如果虛函數(shù)是運(yùn)行期多態(tài)的代表CRTP奇異遞歸模板模式就是編譯期多態(tài)的典型技術(shù)。它的寫法很簡單一個(gè)模板基類派生類把自己作為模板參數(shù)傳給它。template typename Derived struct Base { void interface() { static_castDerived*(this)-implementation(); } }; struct ImplA : BaseImplA { void implementation() { /* A 版本 */ } }; struct ImplB : BaseImplB { void implementation() { /* B 版本 */ } };這里的關(guān)鍵是Base 在編譯期就知道 Derived 的具體類型所以它可以安全地把 Derived 類型強(qiáng)制轉(zhuǎn)換后調(diào)用其成員函數(shù)。這個(gè)調(diào)用不是虛調(diào)用因?yàn)?Base 里沒有任何 virtual——它在編譯期就解析到了具體的 implementation。編譯器甚至可以把整串調(diào)用內(nèi)聯(lián)展開最終達(dá)到“函數(shù)調(diào)用關(guān)系完全靜態(tài)、無任何間接跳轉(zhuǎn)”的效果。CRTP 最常見的實(shí)戰(zhàn)應(yīng)用是仿函數(shù)比較器。標(biāo)準(zhǔn)庫的 std::sort 為什么比 C 的 qsort 快因?yàn)?qsort 要求傳入一個(gè)函數(shù)指針運(yùn)行期每次比較都是一次地址間接調(diào)用而 std::sort 接受一個(gè)模板化的比較器比較器被實(shí)例化為具體類型后operator() 可以內(nèi)聯(lián)進(jìn)排序循環(huán)。這樣一來每次比較不再有函數(shù)指針的開銷而且類型信息讓編譯器可以進(jìn)行更精細(xì)的優(yōu)化比如把某個(gè)比較邏輯簡化為一條指令。C 語言為什么不這樣做因?yàn)?C 沒有模板它的抽象手段在編譯期無法承載“傳一個(gè)無成本的、類型化的比較動(dòng)作”。CRTP 也不只是性能玩具。它可以用來做 mix-in 式的代碼復(fù)用比如給不同的實(shí)現(xiàn)類注入統(tǒng)一的日志、計(jì)時(shí)、序列化能力而不需要它們共享一個(gè)虛基類。要注意的是CRTP 的可讀性和調(diào)試體驗(yàn)都比較差你看到 Base 模板里調(diào)用 Derived 的方法時(shí)需要先接受“繼承方能訪問自家方法”的反直覺結(jié)構(gòu)。每多一層這種包裝報(bào)錯(cuò)信息和調(diào)試棧都更難跟蹤所以 CRTP 適合封裝在庫的內(nèi)部而不是暴露給所有業(yè)務(wù)開發(fā)者直接使用。6.2 策略類與 policy-based 設(shè)計(jì)類型維度上的“組裝工廠”策略類Policy設(shè)計(jì)是零成本抽象在架構(gòu)層面的應(yīng)用。它把一組行為比如分配策略、線程安全策略、錯(cuò)誤處理策略作為模板參數(shù)傳給一個(gè)主類。這樣每種策略組合都會(huì)實(shí)例化出獨(dú)立的具體類型而組合的行為在編譯期就固定了。標(biāo)準(zhǔn)的 allocator 就是一個(gè)活生生的例子std::vector 的第二個(gè)模板參數(shù)就是分配策略同一個(gè)容器類型可以搭配不同分配器生成不同的對象而運(yùn)行期不會(huì)因?yàn)椤翱刹灏畏峙淦鳌钡拇嬖诙喔冻瞿呐乱淮魏瘮?shù)指針跳轉(zhuǎn)的代價(jià)。我用一個(gè)簡化的例子來演示策略類template typename T, typename Allocator std::allocatorT class MyContainer { using alloc_traits std::allocator_traitsAllocator; public: void push(const T value) { Allocator a; T* p alloc_traits::allocate(a, 1); alloc_traits::construct(a, p, value); // ... } };當(dāng)外部傳入不同的 Allocator 時(shí)MyContainer 內(nèi)部的所有操作都按對應(yīng)策略展開。如果傳入的是一個(gè)垃圾回收型分配器或一個(gè)內(nèi)存池分配器容器代碼在編譯期就直接使用對應(yīng)的 allocate/construct 邏輯不會(huì)像虛函數(shù)那樣在運(yùn)行期查表。這就是“組裝工廠”的含義模板參數(shù)是接口的“插槽”類型在編譯期被組合成最終形態(tài)。policy-based 設(shè)計(jì)的代價(jià)是組合爆炸和可讀性下降。如果你定義十個(gè)策略參數(shù)、每個(gè)有幾個(gè)可選值雖然它們生成了幾十種組合類型但你的代碼里并沒有幾十個(gè)類名可以去閱讀。每一個(gè)策略的約束條件一旦寫錯(cuò)報(bào)錯(cuò)信息往往非常晦澀模板實(shí)例化的調(diào)用鏈又長又復(fù)雜?,F(xiàn)代 C 的 concepts 在一定程度上緩解了這個(gè)問題但設(shè)計(jì)此類組件仍然需要較高的抽象能力和清晰的文檔。如果你只是需要一個(gè)“可替換的后端”那么傳統(tǒng)虛函數(shù)接口在維護(hù)成本上可能比策略類門檻低得多。6.3 承認(rèn)“有點(diǎn)成本”是合理的運(yùn)行期多態(tài)的不可替代性零成本抽象講得再多也不該被理解為“一切都要編譯期決定”。有些場景里運(yùn)行期多態(tài)不僅正確而且更合理。第一個(gè)典型場景是插件系統(tǒng)。一個(gè)程序在運(yùn)行時(shí)通過動(dòng)態(tài)庫加載行為未知的第三方實(shí)現(xiàn)。編譯期看不到第三方類型模板根本無從展開這時(shí)虛函數(shù)或 C 風(fēng)格函數(shù)指針接口是唯一的答案。第二個(gè)典型場景是配置驅(qū)動(dòng)或數(shù)據(jù)驅(qū)動(dòng)的類型選擇。你的程序從 JSON、數(shù)據(jù)庫或命令行參數(shù)中讀取某種類型標(biāo)識(shí)然后根據(jù)該標(biāo)識(shí)創(chuàng)建不同類型的對象。如果這個(gè)選擇發(fā)生在啟動(dòng)階段、頻率很低虛函數(shù)的間接跳轉(zhuǎn)成本基本可以忽略但代碼的可擴(kuò)展性和可讀性會(huì)比模板特化或 if constexpr 好很多——新加一種類型只需要寫新類并在工廠函數(shù)里注冊一個(gè)分支。第三個(gè)讓我越來越有體會(huì)的場景是性能的可預(yù)測性比絕對的零成本更重要。在實(shí)時(shí)系統(tǒng)、嵌入式系統(tǒng)或幀率敏感的應(yīng)用中你不僅要知道“平均很快”還要知道“最慢有多慢”。模板實(shí)例化可能導(dǎo)致代碼膨脹進(jìn)而引發(fā)指令緩存壓力這種壓力往往不是某個(gè)單點(diǎn)能精確預(yù)測的而一個(gè)經(jīng)過精心設(shè)計(jì)的虛函數(shù)調(diào)用其最壞開銷相對穩(wěn)定可控。如果你處在這些敏感場景不要盲目地追求“處處編譯期優(yōu)化”應(yīng)當(dāng)以實(shí)際數(shù)據(jù)為準(zhǔn)。我在實(shí)際項(xiàng)目中的做法是先在核心抽象上使用模板和編譯期分派為性能定下基調(diào)然后在那些類型可變更、邊界可插拔的地方明確使用虛函數(shù)并保證它們不在熱循環(huán)中。這樣既有零成本抽象帶來的性能底氣又有運(yùn)行期多態(tài)帶來的靈活性。好的 C 設(shè)計(jì)從來不是“選一個(gè)最好的抽象”而是“知道每個(gè)抽象該用在哪以及它的成本在哪里”?;氐筋}目本身說說我的感受零成本抽象在 C 里不是一條“銀彈”咒語而是一套貫穿語言設(shè)計(jì)、標(biāo)準(zhǔn)庫實(shí)現(xiàn)、編譯器優(yōu)化和工程取舍的完整哲學(xué)。理解了模板和 constexpr 是如何把成本挪到編譯期理解了虛函數(shù)和異常的真實(shí)開銷到底在哪一層理解了優(yōu)化器的能力與邊界你才算真正駕馭了它。我在跟進(jìn)一些改造成果時(shí)最深的體會(huì)是零成本抽象的“零”是需要你去掙回來的——靠設(shè)計(jì)、靠驗(yàn)證、靠對編譯產(chǎn)物和性 能開銷的敏感而不是靠語言本身自動(dòng)給你兜底。希望這篇從原理到實(shí)戰(zhàn)的梳理能讓你在自己的項(xiàng)目里更有底氣地回答那個(gè)經(jīng)典追問“抽象到底貴不貴”
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
欧美AB在线| 国产视频一区二区三区久久亚洲天堂 | 欧美丝袜激情| 欧美日韩91| 亚洲天堂在线怕怕视频| 久久华人网| 国产婷婷一区| 69超碰综合| 操逼操逼逼操操逼91 | 婷婷五月在线视频| 99热欧美| 香蕉久久国产AV一区二区| 日韩操p| 97在线看| 综合另类| 超碰午夜| 97超碰碰| 亚洲天堂五月天国产| 久久久久女教师免费一区| #NAME?| 亚州色站 日韩电影| 国产激情片在线观看| 国产精品女久久久久av爽| AAAA欧美日韩| 91精品人| 中文字幕日韩专区精品系列| 激情小说图片亚洲首页| 襙一襙| 欧美日韩97| 亚洲精品九九九| 天天欧美| 亚欧美色| 欧美人与动性人交a| 韩美日操逼| 亚洲av青草久久一区二区| 亚洲 欧美 第一页| 久久久蜜桃臀无码视频| 久久久性| 日韩av不卡在线看| 亚洲天堂人妻熟妇视频| 精品国产久热在线观看| 99ri视频| 国产精品老熟女一区二区| 91超级碰| 蜜臀人妻少妇久久在线观看| 九九九久久久久| 欧美中文字幕一区 | 嫩草在线视频| 人人色97| 打av高清| 久欲AV| 亚洲做性| 九九热九九| 青青操网| 中国东北熟女老太婆内谢| 久精品无码av一区二免费国产在线观看| 免费看黄视频亚洲网站| 1769一区二区| 国产不卡片| 国产精品制服丝袜中文字幕日韩一区二区三区| 亚洲色91C| 五月天亚洲网| 日本在线观看网址| 乱伦1色页| 成人精品在线| 18禁久极品美女久久哦哟呀!| 色综合99999| 高清无码人妻久久久一区二区三区aⅴ| 78精品| 日韩欧美性吧婷婷乱伦大香蕉| 97操| 五月婷婷丁香| 国产精品色哟哟| 国产免费一区在线观看| 成人网站 免费观看| 国产又爽又黄| 国产九区| 日本大香蕉综合网| 一区二区三区高清天码| 亚洲九九夜夜| 躁躁日曰躁2020| 欧美日韩国产色五月综合在线 | 97视频播放| 亚洲欧美国产中文视频| 欧美成人都市人妻| 中文欧丝袜诱惑| 操国产高清| 黑人黄片在线免费观看| 1234区中文字幕在线观看_青青草国产在线_日韩一区二区 | 亚洲欧美激情在线视频| 日夜久久久九九九久| 欧美在线第五页| 曰韩人妻中文字幕在线| 在线观看日韩av不卡| 青青草五月天| 亚洲欧美色图小说| 色婷婷综合网| 久久精品久| 亚洲一区日韩| 四虎av在线| 福利在线观看一区二区| oumeizonghese,www| 精品天堂| 丁香六月啪啪| 91综合熟女| 性爱综合网| 亚洲国内精品成人不卡| 免费久久一级毛片大黄| 男人的天堂2018.| 99re98| 男女一级A片大黄,一进一出| 欧美综合1性辶| 日日噜噜夜夜狠狠视频无| 无码欧美有限公司| 国产高清在线观看欧美| 蜜臀无码一区二区| 中国女人内射6XXXXX| 吉田爱美AV在线| 亚洲美女AV无码| 久久极品一区二区| 日韩一级欧美一级国产一级台湾| 少妇蜜汁| 香蕉国产精品麻豆亚洲欧美日韩| 干B视频伊人网| 神马久久久久久久| 综合激情一一91| 一级@啪啪视频| 九九九九九九视频免费| 东京热激情视频一二三区| 中国少妇啪啪视频| 麻豆天美久久91| 可免费观看的av毛片中日美韩| 精品四五区| 草草草视频在线免费看| 欧美另类自拍| 欧美自拍偷拍免费观看| 亚洲天堂2020| 91扒丝袜综合在线| 国产99久久99热这里只有精品15 | 欧美懂色综合网| 国产欧美第五页| 欧色网址| 超碰97网址| 欧美日本中字另类在线| 亚洲熟女少妇免费视频| 伊人久久婷婷| 成人a v在线播放免费| 日韩/97| 黄色在线网站| 久久久久久九九九九九| 天天综合欧美综合| 丁香激情五月| 久久精品国产99精品亚洲蜜...| 亚洲精品久久一区二区三区蜜桃臀| 欧美十八禁网站| 天天影视91看看| 蜜桃成人1区2区3区| 97资源超碰| 久久av无码| 九九九国产精品| 欧美一二三区四五区| 少妇高潮对白在线观看| 亚洲巨爆乳一区二区三区四季网| 91 丝袜在线观看| 久久一区无码| 欧美专区日本专区| 国产粉嫩蜜臀av一区二区三区| 91丝袜美腿片| 夜夜狼人妻| 黄色av一区二区在线| 日韩免费在线观看不卡| 久久二| 怡春苑东京热| 九九天堂| 狠狠穞A片一區二區三區| 国产传媒操逼视频| 精品无码秘 人妻一区二区| 成人十八禁日韩欧美一二三| 熟妇高潮一区二区免费视频| 久精品无码av一区二免费国产在线观看 | 色天堂在线观看| 久久久影院| 久久久麻豆精品| 亚洲AV秘无码一区..| 夜夜高潮夜夜爽夜夜爱爱一区| 久久国产对白激情浪潮| av婷婷色网| 亚洲五月天激情| 黄页网站免费高清在线观看| yiqicaoav| 亚洲影视高清三级-草1024榴社区入口-品爱AV| 九九九久久久久| 97干com| 99欧美| 欧美v亚洲v日韩v最新在线二区| 乱性AV| 夜夜肏2021| 69精品久久久久中文字幕| 亚洲国产一级黄色视频| 亚洲AV无码乱码| 大香久久| 黄骗免费网站| 亚洲国产av中文字幕久久| 亚洲欧美黄| 欧美美女视频| 日本性感人妻91| 蜜臀一区二区三区在线| 亚州熟女乱伦| 99精品欧美一区二区三区桃色| 在线观看亚洲成人精品| 狠狠色狠狠色狠狠五月| 日本操逼二区| 久9热| 国产一区二区三区影片| 精品人妻伦一二三区久久| 一区二区三区精品久久| 99在线观看| 色播五月丁香| 久久这里精品国产99丫e6| 亚洲一区二区三区久久 亚洲一区二区| 发朗少妇买婬全视频中文| 久久久五月天| 精品人妻一区二区三区夜夜| 久草老司机| 日韩在线观看AV| 亚洲天堂少妇| 九九九九精品精| 性色亚洲| 国产大陆天天艹| 操逼视频免费日韩无码| 丁香婷婷久久| 97久久超碰国产网站| 青青草国产盗摄一二三区| 91综合国产精品| 欧美高清在线| 日本高清免费一本视频在线观看| 麻豆色99999| 日韩在线电影| 另类小说综合网| 欧美黄片视频在线观看免费 | 97人人夜| 欧美人与动性人交a| 天天干夜夜一操| 志村玲子视频一区二区| 久久婷婷欧美| 久久东京热久久| 翔田千里无码中出中文字幕| 丁香五月婷婷基地| 丝袜亚洲91| 600国产精品视频| 为用户提供免费看黄网址在线观看| 日韩欧美一级特黄大片| 青青11操操操操操操操操| 中文字幕88av在线| 天天操福利视频综合网站| 天天肏视频| 福利视频一区二区微拍| 亚洲欧洲美腿丝袜| 青青草影视蜜久久| 国产网红精品| 800zy一区二区| 美女网站黄页| 操B视频日韩无码| 嗯嗯啊在线视频| 青青伊人加勒比海| 亚洲欧洲成人在线电影| 久久98| 精品久久久高清无码| 动漫爆乳3D奶水一区在线观看| 小草三级久久观看| 99色热| 美国一区二区三区视频| 三上制服丝AV| 精品少妇999| 国产少妇肉丝在线观看| 91狠狠综合久久| 超97在线精品视频| 大香蕉综合在线| 91丨九色丨国产丨人妻在线 | 91爱欧美| 日韩免费在线视频观看| 欧美色图天堂网m| 久久永久无码人妻视频| 无码99| 丰满人妻一区二区三区四区| 久久露脸国产老熟女| 日韩精品9区| 少妇一级婬片免费放一级a性色.| 后入内射蜜桃臀| 超碰97中文| h在线看免费版在线看| 麻豆色约约| 亚洲精品无码少妇久久| 日本ZZ高免费A级视频| 国产一区二区在线电影| 熟女熟妇伦久久影院毛片一区二区 | 伊人久操| 91操熟女视频| 天天天天干| 九色婷婷| 欧美色欧美| 欧美三级一级| 搡老熟女免费视频 | 无码人妻一区二区三区免费九色| 福利风月五月天影院| 国产女人视频三四五区| 国产精品女同| 日本欧美一区二区三区视频麻豆| 欧美高潮| 日韩高潮一区| 欧美欧美啪啪视频| 色麻豆AV| 日本熟女中文| a级免费在线观看| 国产精品色哟哟| 91在线视频免费播放| 亚洲图片在线| 99热免费| 天天色黄色影院天天操| 日日97| 爆乳免费黄网站| 亚洲天天做日日做天天谢日日| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 日韩人妻播放| 少妇天堂| 久草综合视频| 国产精品久久久三级无码| 大香蕉日韩| 九九拍拍精品视频在线播放 | 欧美青青视频| 天天流夜夜操| 免费看黄视频亚洲网站| 99re视频这里只有精品| 色欲色香天天天综合网www-亚洲综合国| 乳欲人妻办公室奶水| 人妻激情视频| 男人的天堂色偷偷青青草视频婷婷网| 开心五月婷婷激情| 人妻一二三区| 亚洲激情片| 欧美精品三区| 日韩成人午夜精品久久高潮| 乱色视频中文字幕| 黄片国产精品一区二区| 好涩综合| 欧美色老汉| 蜜臀AV成人精品蜜臀AV久久| 日日日日日| 韩国一级AAA| 91日韩国产欧美亚洲另类精盘州至城都| 熟女色图在线| 亚洲综合五月天婷婷丁香| 影音先锋视频在线| 精品一区二区三区国产| 蜜臀99久久国产| 日韩不卡网操逼中文字幕日韩| 99re9在线| 婷婷五月天激情网| 99国产在线 精品 视频| 成人午夜高潮av猛片| 天堂av最新电影网| 激情小说亚洲图片| 亚洲精品一区二区免费在线观看| 欧洲Au麻豆| 一二三区在线| 激情五月丁香五月| 婷婷91| 国产精品视频白浆免费| 久久美女国产| 国产精品熟女九色九色蜜臀| 狠狠色伊人亚洲综合网站色| 亚洲欧美日韩制服另类| 91操熟女| 永久电影三级在线观看| 永久电影三级在线观看| 日本欧美中文字幕| 五月婷亚洲精品天堂| 蜜臀99久| 高清视频一区| 色综合国产在线观看| 亚洲激情视频| 欧美色图综合| 成人一道本免费视频| 人妻少妇久久中文字幕一区二区 麻豆| 大香蕉日韩| 久久久性爱| 欲香欲色综合天天伊人| 天美传媒AV在线| 性色亚洲| 强奸乱伦AV网站| 人妻中文字幕精品无码| 亚洲国产高清福利视频| 日韩精品中文字幕二区| 国色天香av| 天综合网| 热久久九九热| 欧美洲精品一级| 偷拍99| 亚洲国产综合图区中文字幕 | 色玖玖| 91neishe| 亚欧中文字幕在线视频| 色五月AV在线| 亚洲综合网91| 国产精品探花色| 国产久久av| 精品一区二区人妖| 97精品国产97久久久久久免费| 久久国产99精品72福利| 欧洲亚洲人人爽爽视频| 99999国产| 五月亭亭六月丁香| 欧美经典一区二区三区| 色综合五月天| 亚洲综合夜色| 亚洲 在线| 蜜乳中文字幕a在线| 欧美性爱1080p| 婷婷九月色| 一区二区首页| 深喉吞精| 欧美激情性久久久久久| 日本天天色| 91久久堂| 国产精品精品系列在线观看| 日本色色色色色视频| 色婷婷影院| 国厂麻豆77q4| 亚洲无992tv| 国产麻豆福利av在线播放| 五月婷婷五月天| 精品亚洲俞拍视频一区| 天天干18禁| 色成人Www精品永久观看| 天天综合在线4| 四虎在线观看网站| 欧美 精品国产制服第一页| 国产成人精品日本视频| 69人妻精品丰满熟女区| 中文字幕99999| 99热在线观看| 人人操人人射人人干| 国产熟女精品一区二区| 大屁股xxxxx| 狠狠夜色午夜久久综合在线| 国产白丝精品在线观看| 亚洲欧洲另类| 玖日综合网| 韩国一级AAA| 日本美女性生活久久久久久久| 超碰色美女| 国产人伦a片信息免费片| 亚洲熟妇图片| 免费国产视频| 韩国久久97| 91青青| 亚洲aV性爱| 天天影视91看看| 超91综合网| 97欧美日韩精品| 国产乱人伦AVA麻豆软件.| 99re这里| 操逼片中文| 国产中文字幕在线观看| 视频二区美腿制服人妻欧美| 女人午夜视频777| 九九九九九用不成了| 欧美色www亚洲国产阿娇要播| 五月天婷婷成人网| 婷婷激情四射| 人人操AV| 亚洲综合第一页| 天天流夜夜操| 成人线上超碰| 99国产在线绯色一区| 97综合久久| 精品人人| 青娱乐福利99| 国产一区二区三区久久精品太古里| 69少妇一区二区| 国产精品视频| 人、人、摸,人、人、草| 嫩草91| 黄色片大香蕉| 黄页| 久草婷婷| 国产剧情AV不卡在线观看| 日本三级韩国三级美三级91| 黄片在线免费在线观看| 欧美人妻少妇| 亚洲大色堂| 欧美人妻精品一区二区| 久久久555| 色噜噜人妻av 中文字幕| 亚洲电影中字一区二区| 夜夜免费视频| 少妇高潮99p| 18禁在线视频| 久久久亚洲熟妇资源| 夜夜爽33333| 老子午夜伦不卡影院| 懂色av中文字幕一区二区三区天美| 在线观看黄色电话| 白丝AV| 国产精品在线网站| 人妻久久久| 26uuu性物| 97操B| 亚洲精品欧洲精品| 熟女视频久久| 国产一区免费午夜视频| 成人AV在线网站| 91丝袜美腿网站| 久久免费精品视频免一| 久久产精品一区二区三区电影| 色九九综合AV| 天操天操夜操夜月操月年年操| 日本操大逼| 97在线观看| 欧美日韩97在线| 日韩影片中文字幕一区二区三区| 欧美视频边做饭边橾| dy888午夜老子影视达达兔| 国产视频第2页| 丝袜熟女2P| 综合久久欧美| 国产精品黄色三级av| 好爽视频在线观看视频| 精品人妻久久久久一区二区三区| 超碰中文字幕人妻草一区| 99精品在线| 日韩无码黄色片| 亚洲人成网站7777| 九九九九9999| 久久99国产精品| 疯操AV| 天美欧美国产| 歐美一級亂黃99在綫精品| 亚洲色综合| 国产女人91精品嗷嗷嗷嗷| 日韩亚洲精品一区二区| 一区二区三区在线美女| 最新亚洲黄色免费电影 | 天天亚洲| 少妇无码999| 嗯嗯啊啊啊好爽| 99re在线视频国产| 色哟哟av网址| 欧美大干日韩| 尤物视频偷拍免费| 蜜桃臀一区二区三区久久| 在线观看视频91| 九九九久久久久| 日韩国产十八禁| 天堂资源欧美| 一区麻豆 高清中文字幕| 久热色情精品| 欧美色66| 超碰免费欧美7| 欧美熟女丝袜| 怡红院亚洲怡春院av| 久久久久96| 91插B网站| 9久久久久久| 亚洲无码一区成人免费午夜 | 九九久久九九久久| 天天综合精品| 人妻人人澡人人爽人人| 97在线资源| 亚洲AV永久无码精品成人调教| 91久久久久| 日韩97超碰| 日韩大香蕉| 色综合国产在线观看| 午夜视频久久久久一区| 国产综合网站在线播放| 国产综合操逼高清| 一道本久久棕合爱| 91艹逼精品| 中文字幕诱惑制服人妻丝袜美丝袜美| 超碰久久综合| 91精品国产一区三一| 东京热一区二区中文字幕| 韩日色费| 黄色av一区二区在线| 床上啊啊啊一区二区三区| 人妻精品4K4K4K4K4| 欧美乱妇狂野欧美在线视频| 天天日天天干天天摸天天操| 久久久久九九九九| 人人看欧美性爱| 99热最新| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 成年人网站在线免费观看| 激情抓乳插进去啪啪啪日韩| 日本三级韩三级99久久| 少妇一区二区三区在线观看| 亚洲精品久久一区二区三区蜜桃臀| 中文字幕乱妇免费视频| 国产成人精品必看| 三级三级三级日本99| 在线黄色污污网站| 97亚洲在线| 91精品国产日韩欧美综合| 五月丁香六月激情| 男人精品天堂一区| 四虎精品永久在线播放| www…国产操逼| 三四中文字幕| 伦伦成年午夜免费视频| 欧美日韩情色一区二区| 国产日韩中文字幕欧美| A一区片| 欧洲色| 色网1| 国内亚洲高清无码| 亚洲性爱高潮影院| 日韩欧美~中文字| 宅男影院久久久,99| 97九色人妻| 欧美肥臀在线| 亚洲 国产 精品一区| 亚洲熟妇无码一区二区三区| 日本天天干天天操一区| 人人插人人搞人人操| 1024手机看片欧美日韩| 国产精品久久久久久亚洲色欲| 欧美日韩999| 色悠久久久av| 人人操人人摸人人看人人干| 中文字幕亚洲欧美在线不卡| 97在线免费视频| 99性爱视频| 国产精品白丝AV| 熟妇操花| 国产av色网| 欧美 精品国产制服第一页| 色综合av男人天堂| 久久99精品九九久久久婷婷| 中文字幕乱码人妻二区三区| 伊人久久国产免费观看视频| 久久综合九色综合欧洲98| 少妇一线天久久久久久| 欧美人妻制服| 艹我哪美一区无码| 欧美天天综合网| 色穴精品| 男人女人18禁片免费看网站| 有码人妻系列| 日本欧美一区二区三区视频麻豆| 久久久久久91香蕉国产| 成人av影院在线观看| 啊啊啊不要啊啊受不了了视频在线| 亚洲午夜未满十八勿入网站日本又色又爽又黄| 夜夜操2028| 超碰在线人人射| 青青草在线视频人人想人人上| 人人操人人摸人人骑| 日本青青草在线| 老外又粗又长一晚做五次| 99色日| 亚欧成人中文字幕一区| 美女黄色91| 熟妇熟女亚洲天堂网| 日本国产欧美一区三区二区| 国产精品直播在线观看直播| 久久久性爱视频| 日本Xx性爱| 欧美性高潮| 中文字幕91综合| 韩国手机不卡无码三级视频| 操91| 欧美操逼一二三区| 免费家庭乱伦视频| 玖玖爱伊人玖玖爱| 六月激情网| 综合久久久久久久久91| 无毛精品| 国产后入精品| 久久美女国产| 超碰美国| 三级片大波波| 亚洲黄色视频在线观看视频| 九一性生活免费视频| 亚洲激情AV| 欧美18 在线观看| 亚洲激情深爱文学小说网站| 天天爽爽爽爽| 国产色精品午夜大片| 久久国产精品m码| 欧美日韩国产男人| 亚洲精品日日夜夜52| 97情超碰色| www.色婷婷色综合| 无码直播久久久| 亚洲区小说| 日韩啪啪啪视频| 国产久久av| 久久久新亚洲AV| 91精品久久久久久| 欧美日韩婷婷中文| 久久精精区一区二区一蜜桃一区二区| 懂色av色欲av蜜臀av| 亚洲国产97| 941超碰| 欧美72网页| 日本超碰在线国产一区| 一级久久性爱视频| 亚洲精品尤物yw在线影院| 偷拍盗拍亚洲色图图片| 国产免费一区| 亚洲第一色页夜| 青青草原人妻| 五月花婷婷| 无遮挡h肉动漫在线观看| 日日夜夜草草草| oumeisetu综合| 精品少妇一区二区三区在线视频| 国产成年精品高清在线观看91| 亚洲精品人体| 凹凸 69堂 在线播放| 久污| 后入式视频国产自| 欧美在线l亚洲| 国产精品午夜成人福利| 精品久久久av| 亚洲国产欧美日韩人妻日中文| 中文字幕性感少妇av| www.91理论| 国产一级内射无挡观看| 国产精品一二三区18| 激情小说亚洲| 69麻豆天美| 亚洲色图欧美| 最近二区三区视频大全| 精品对白久久不卡| 好爽视频在线观看视频 | 97色亚洲| 亚洲图片欧美| 粉嫩av在线| 精品人妻一二三| 国产无码成人无码| 夜夜草我| 大香蕉www.超碰| 超碰在线香蕉| 免费中文在线| 亚洲夜夜欢无码一区二区| 亚洲欧美经典一区二区| 五月婷婷六月丁香| 亚洲国产精品乱码在线观看| 人人澡人人爽人人精品| 夜夜操av亚洲一区二区| 九X超碰| 噜噜噜亚洲精品| 久久影视二区三区行押| 嗯嗯不要 视频| 五十路熟女人妻一区二区在线观看| 中文乱码字幕观看视频| 国产精品久久久啊| 不卡av在线中文字幕| 成年人性爱日韩| 激情婷婷| 午夜欧美J进J出白浆流出久久久| 加勒比日本在线| 国产热av| 国产精品9999| 国产成人 综合亚洲 天堂| 人妻 制服 日韩 中文 在线| 91处女在线视频| 男人综合网| 蜜乳成人AV| 91精品无码人妻系列| 女优免费一区二区永久| 日日夜夜青青草母狗| 日本久久久精品电影| 久久系列| 无码天天操| 91大学精品激情戏| 九九九九九九九九九五码| 一区二区三区男人的天堂| 色噜噜狠狠色综无码久久合欧美| 国产精品麻豆免费视频| 久久99精品视频| 裸模AV女优| 久久大香蕉97| 人人摸.人人色| 色婷婷av在线观看| 美日韩在线不卡人妻| 变态综合色| 一区二区三区黄色片a| 日产狠狠干| 国产妇女精品视频青青草| 另类欧美色| 国内毛片婷婷六月色| 台湾佬激情综合| 熟妇激情| 日本欧美韩国国产在线| 大香交伊人网| 成年人免费观看网站| 亚洲人成网站7777| 99热最新网址| 国产吹潮女在线观看| 超碰在线人妻中文字幕| 狠狠操狠狠爱| 98福利在线视频| 超碰97人妻免费在线| 在线只有精品| 人妻大香蕉| 啪啪啪东京| 久久国色天香香蕉| 日韩在线电影| 成视频在线观看免费看| 青青草日韩免费观看高清在线| 亚洲一级黄色毛片| 淮穴色AV| 少妇天堂| 久久九九网| 蜜臀99久久精品| 国产69精品久久久久99尤物| 欧美在线啊啊啊| 日韩视频精品在线观看| 江都AV在线| 久久东京热久久| 狠狠色婷婷| 农村少妇久久久久久久| 国产成人精品日本亚洲语言| 劲爆欧美人妖三区91| av绯色| 福利在线视频一区二区| 国产精品人人爽人人做可爱福利| 国产人伦精品一区二区三区| 思思久热在线精品66| 日韩97超碰中文字幕| 97干在线视频| 青青操青娱乐| 97aiaiai| 免費人妻夜夜爽天天爽爽一区| 中文字幕三四区| 99这里有精品| sss视频华人在线| 曰韩人妻中文字幕在线 | 人妻色偷色噜| 大香蕉免| 久久久久亚洲av综合波多野制衣| 欧美日韩一干二干| 涩涩这里只有精品视频| 少妇内射视频| 97人人射| 亚洲av青草久久一区二区| 久久色激情一区二区三区| 2017av无码免费无线播| 99www.bibizy香蕉资源国产一区二区三区高清 | 日韩精品在线观看观看| 青青草中日韩在线| 亚洲人妻AV| 亚州91| juliaann丝袜大战黑鬼| 久久久无码av精| 天躁夜夜躁2021| 人妻日日夜夜精品| 日本一区视频在线观看| 九九九九九九免费视频| 五月综合久久| 强奸乱伦免费网站| 伊人在线大香蕉二。| 人妻少妇一区二区| 你懂的在线观看区国产| 丝袜高跟澳门91视频| 久久婷婷五月天| 日本三级A片网站com| 国产91丝袜在线播放蜜月| 狠狠操狠狠插| 欧美的性爱网站免费| 老色鬼成人精品视频下载大在线观看| 国产毛片精品一区二区色欲黄A片| 亚洲人成在线放东京热| 97jingpin| 天天操女人| 狠狠色噜噜狠狠狠狠狠色综合久久| 奶水 人妻 哺乳 在线| 婷婷激情一区二区三区俺也去| 欧亚乱色熟女一区二区| 97超碰中文在线| 欧美97视频| 久久香蕉国产传媒一区剧情天美| 秋霞网—男女啪啪亚洲免费体验区| 公司1区2区3区精产精| 久久9 9 9精品| 天天干天天操天天干天天操| yiqicaoav| 亚洲欧美视| 少妇天堂网络| 99热| 亚洲九月丁香| 狠狠色伊人亚洲综合网站色| 青青青在线高清视频在线一二三四区| 日日橹狠狠爱欧美超碰| 屌逼传媒| 99热只有这里有精品| 手机在线免费看的av| 91精品国产91熟女| 岛国不卡超碰护士AV在线播放| 日本美女性生活久久久久久久| 极品色www影院| 成年人三级黄色片视频| 夜夜骑夜夜操| 丰满人妻一区二区三区| 国产精品久久久久久久黄无码| 国产精品视频内谢女人| 97亚洲色图| 欧美激情亚洲情色| 久久大陆| 女生自91网站| 亚洲最大的黄色电影网站。| 99热综合| 柠檬AV导航| 强奸乱伦资源| 久久人人爽爽人人爽人人片αV| 国产一区二区三区高清视频| 日本媚薬中文字幕在线| 美女天天干| 色五月AV在线| 欧美激色| 99re热| 97在线资源| 日韩天天本| 亚州久久9| 黄网站黄视频网站进入口| 天天操女人| 1024亚洲中文字幕久在线看片你懂的| 大香樵伊人网| 久久久久成人蜜桃精品| 色婷婷综合网| 婷婷97| 丁香激情五月| 人人乐大香蕉| 91在线免费观看处女| 好淫网一二三视区| 丰满翘臀美女影院视频| 91在线视频免费中出| 四虎AV无码| 丰满搜索结果 -第18页- 久久高清无码| 久久9亚洲| 欧美色图私拍91| 久久中出在线| 91女优在线观看 | 乳欲人妻办公室奶水| 少妇3P性爱自拍| 欧美一区二区三区另类精品| 亚洲黄色a级片| 全球成人中文在线| 337p大胆噜噜噜噜噜91Av| 91碰碰| 日本亚洲vr欧美不卡高清专区| 亚洲情色一区综合| 久久鲁夜| 2020中文字幕在线| 日韩情色一区二区| 青娱乐二区免费| 一本精品日本在线视频精品| 色伊人91| 婷婷五月天社区| 欧美日日夜夜| 黄色片G G G| 青草精品视频一日本久久久久网站| 日本一区二区三区四区五区六区七区八区九区| 欧美91在线| 丰满人妻一区二区三区四区| 色青青久久影视| 一色网男人的天堂| 60秒免费小视频| 欧美啪啪啪91| a亚洲欧美色欲| 国产女人91精品嗷嗷嗷嗷| 亚洲国产第一页综合视频| 91欧美美女日韩国产婷婷| 超碰在线在公开超碰在线在公开| 欧美天天干| 涩涩这里只有精品视频| 东京热免费视频| 岛国人妻少妇av在线观看| av日韩中文字幕| 午夜性刺激视频免费观看| 成人八戒网站| 国产av白丝| 久男人久久| JIZZJIZZ亚洲女人被躁| 日本国产欧美高清在线| 欧美美女自慰一区二区三区| 97精品第3页| 天天射夜夜骑| 久久九九视频九九视频| 欧美性特| 97天天插| 欧美日韩黄片精品在线| 天天干天天爽| 99re在线视频国产| 欧美人与动性人交a| 99久久9| 夜夜操一区二区| av网站免费看| 国产激情综合| 亚洲色图第一页| 丁香五六月啪啪| 天天干一干| 天天搞欧美| 少妇一区二区三区精选| 97舔舔| 欧美亚州综合网图片| 制度丝袜99| 手机不卡视频不卡在线一二三区| 综合五月天| 亚洲AV无码成人精品久久| 青青草日本中文字幕| 另类天堂| 亚洲不卡AV在线| 999国产精品999久久久久久| 国产AV无码AV| 老司机免费视频在线91| 国产精品一区二区手机看片| 偷拍伦理视频| 亚州综| 大香蕉手机视频| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 亚欧操逼片在线观看 | 久久老子无码午夜伦不卡| 欧美亚洲se91| 国产精品麻豆免费视频| 天天天肏屄欧美| 国产操逼网站亚洲一级黄色| 久久女人一区二区三区| 加勒比aⅴ| 大香蕉九九| 久久精品无码一区二区三区| 91超级碰碰碰| 国内一级精品| 涩五月婷婷| 中国特猛少妇色xxx| 欧美日韩国产在线| 综合久久2017| 天天综合亚在线| 日韩兔费看黄片| 91女在线观看| 超碰97人人cao| 99re69综合| 久久青青草原免费视频| 天天天天天超碰| 超碰成人最新最好看| 青青草久久| 岛国精品视频在线观看| 国产日韩怡红院| 色香阁在线| 亚洲国产精品无码AV久久久| 久久超碰97中文字幕| 精品成人亚洲午夜电影| 欧美性天天影院| 囯产乱伦一区二区三女| 国产三级中文字幕粉嫩| www.99色| 欧美一区二区三区不卡高清视频| 国产专区路线| 亚洲精品一二区| 日韩AV噜噜噜一区二区三区四区| 亚洲操操| 亚欧免费观看视频| 日韩精品电影| 成人片在线播放| 久操电影| 亚洲熟久久| 99久久99久久综合| 一级性爱视频免费观看 | 亚欧性爱无码| 黄站在线免费观看| 91蜜臀熟女| 日本 色 导航| 狠狠入| 亚州色站 日韩电影| 婷婷激情五月天小说网| 国产精品久久久久久久久久久久久久吹 | 国产精品电影| 激情小说日韩无码| 欧美在线干| 91九九九馒头| 亚洲成人美女无吗| 97国产人人| 一区二三区四区视频大全套| 99热这里都是精品| 国产精品毛片?v一区二区三区| 一本大道久| 日韩超碰精品综合| 久久99网站| 日韩性爱毛片操骚逼| 亚洲资源站| 欧美第二页午夜| 肉丝网站91| 婷婷亚洲综合| 岛国毛片在线观看免费| 夜夜久久久| 99热这里只有是精品10| 青青国产精品在线| 久久一级无码精品毛片6| 凹凸视频在线一区二区| 中文字幕免费在线观看| 欧美中字二区| 久久最新免费视频23| 日韩性爱网址| 国产探花精品在线| 我要去看2个日本美女.com曹逼| 欧美综合色| 青青欧美| 二对二中文字幕。| 熟女丰满人妻一区| 国产成人网站在线观看| 可能人人看人人摸| www.色吧5.com| 欧美色涩| 欧美色干| 一区二区播放| 超碰97在线色男人??| 欧美色图亚洲特色| ′ !γ}丶。。久久精品欧美一区二区三区 | 九九热精品在线| 白嫩国模丰满一二三区| 午夜乱轮操逼视频免费看| 97在线免费观看视频| 亚洲小说视频| 玖色av| 俺去啦自拍| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 色婷婷综合久久久久中文一区二区 | 乱抡国产91| 一区二区 日韩 欧美 国产 传媒| 97最新在线播放视频| 伦伦成年午夜免费视频| 日本一区二区三区午夜观看| 色吧91| 欧美AB在线| 天天92av| 欧洲综合色图| 亚洲久9| 欧美日韩另类激情图片| 欧美性色欧美| 久久久久久九九九九九| 超碰超碰超碰超碰的大鸡吧操黑丝袜| 色偷偷男人的天堂麻豆| 天天日美女的B| 天堂涩涩| 亚洲综人网| 日本亚洲嫩草影院啪啪| www.人人摸在线视频| 国产精品久久久久久久久久二区三区| 久久久天美| 人人操人人精品影片| 欧美日韩亚洲国产中文永久天天看| 欧美91久久久久| 超碰在线1234区| 蜜桃天美传媒AV一区二区三区| 欧美中日韩XXXX| 天久久久噜噜噜久久国产精品爽爽| 伊人加勒比|