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

ARTICLE DETAIL

資訊詳情

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

C++多態(tài)與虛函數(shù)表:動(dòng)態(tài)綁定原理、性能與工程實(shí)踐

C++多態(tài)與虛函數(shù)表:動(dòng)態(tài)綁定原理、性能與工程實(shí)踐 1. 多態(tài)不是語(yǔ)法糖而是一套運(yùn)行時(shí)契約1.1 靜態(tài)綁定與動(dòng)態(tài)綁定的關(guān)鍵區(qū)別很多人學(xué)C多態(tài)第一反應(yīng)是“繼承 virtual關(guān)鍵字 基類指針調(diào)派生類函數(shù)”背完語(yǔ)法就覺(jué)得自己會(huì)了。但落到實(shí)際項(xiàng)目里一遇到性能問(wèn)題、構(gòu)造析構(gòu)時(shí)序、跨模塊調(diào)用這些“會(huì)了”馬上就露餡。因?yàn)镃的多態(tài)本質(zhì)上不是語(yǔ)法層面的一種寫(xiě)法而是編譯器為我們生成的一套運(yùn)行時(shí)調(diào)度協(xié)議。理解這套協(xié)議才算真正理解動(dòng)態(tài)綁定。先看綁定的概念。所謂綁定就是確定“調(diào)用p-speak()時(shí)到底執(zhí)行哪一個(gè)函數(shù)體”。靜態(tài)綁定發(fā)生在編譯期編譯器看到表達(dá)式類型就確定地址比如普通重載函數(shù)、模板實(shí)例化這些都是編譯期就能定死的事。動(dòng)態(tài)綁定則發(fā)生在運(yùn)行期編譯器此時(shí)只知道“p是Animal*”但p指向的到底是Dog還是Cat要到程序真正運(yùn)行取出p的實(shí)際類型才知道。為了做到這點(diǎn)C選擇的方式是給類生成一張?zhí)摵瘮?shù)表再讓每個(gè)對(duì)象內(nèi)部保存一個(gè)指向該表的指針。調(diào)用虛函數(shù)時(shí)程序先通過(guò)對(duì)象拿到虛表指針再?gòu)谋碇胁榈綄?duì)應(yīng)入口地址。這條間接路徑就是“動(dòng)態(tài)”二字的來(lái)源。這里有個(gè)容易混淆的點(diǎn)virtual關(guān)鍵字本身并不會(huì)給函數(shù)增加什么魔法它只是告訴編譯器“這個(gè)函數(shù)放進(jìn)虛表調(diào)用時(shí)走動(dòng)態(tài)綁定”。如果沒(méi)有virtual即使寫(xiě)Animal* p new Dog;調(diào)用p-speak()時(shí)執(zhí)行的仍然是Animal::speak()因?yàn)榫幾g器只認(rèn)p的靜態(tài)類型。我見(jiàn)過(guò)不少代碼把基類的普通函數(shù)和虛函數(shù)混著寫(xiě)調(diào)了半天結(jié)果發(fā)現(xiàn)有的走動(dòng)態(tài)綁定、有的走靜態(tài)綁定行為時(shí)對(duì)時(shí)錯(cuò)。這就是沒(méi)搞清楚兩者邊界的典型癥狀。動(dòng)態(tài)綁定的價(jià)值是讓調(diào)用方只依賴穩(wěn)定接口不需要在調(diào)用點(diǎn)寫(xiě)if (type Dog) ... else if (type Cat) ...這類分支。它把“變化的部分”交給運(yùn)行時(shí)去分發(fā)調(diào)用方的代碼因此變得穩(wěn)定、可擴(kuò)展。1.2 虛函數(shù)表編譯器替我們埋好的路由表要理解動(dòng)態(tài)綁定繞不開(kāi)虛表vtable和虛指針vptr。我習(xí)慣把虛表理解成一張路由表函數(shù)名對(duì)應(yīng)一條表項(xiàng)表項(xiàng)里存的是真正要執(zhí)行的函數(shù)地址。當(dāng)一個(gè)基類指針調(diào)用虛函數(shù)時(shí)它做的事就是先從對(duì)象的vptr取出虛表地址再去表里查函數(shù)入口最后跳轉(zhuǎn)執(zhí)行。虛表是編譯器在編譯階段生成的每個(gè)含有虛函數(shù)的類都有自己的虛表。派生類如果覆寫(xiě)了某個(gè)虛函數(shù)這個(gè)函數(shù)在新類的虛表里就會(huì)指向派生類的實(shí)現(xiàn)沒(méi)有覆寫(xiě)的部分則繼續(xù)指向基類的實(shí)現(xiàn)。所以我們可以說(shuō)虛表是一張“按類生成、按對(duì)象持有指針”的路由表??吹竭@里你可能想問(wèn)既然虛表由編譯器生成vptr又是每個(gè)對(duì)象都有的那這個(gè)隱藏成員到底放在對(duì)象的哪個(gè)位置不同編譯器布局略有差異但在主流平臺(tái)上vptr一般位于對(duì)象內(nèi)存布局的開(kāi)頭。這意味著一個(gè)普通的空類沒(méi)有虛函數(shù)時(shí)大小是1字節(jié)為了占位有了虛函數(shù)之后大小變成8字節(jié)64位平臺(tái)——多出來(lái)的正是vptr占用的空間。這個(gè)細(xì)節(jié)對(duì)工程有直接影響。比如兩個(gè)不同類如果它們的內(nèi)存布局都包含vptr你把一個(gè)對(duì)象用memcpy強(qiáng)行拷貝給另一個(gè)再以派生類指針去調(diào)用虛函數(shù)輕則讀到錯(cuò)亂的虛表地址重則直接崩潰。凡是涉及序列化、內(nèi)存映射、緩沖區(qū)復(fù)用的代碼都要先把“對(duì)象里有沒(méi)有vptr”這件事想清楚。另一個(gè)實(shí)用點(diǎn)是繼承鏈。多層繼承時(shí)對(duì)象里只保留一個(gè)vptr單繼承情況下指向“整個(gè)繼承鏈最終形態(tài)所對(duì)應(yīng)的虛表”。否則無(wú)法解釋為什么Animal* ap new Dog;和Dog* dp new Dog;即使變量類型不同訪問(wèn)到的虛函數(shù)也能一致。因?yàn)閮蓚€(gè)指針指向同一個(gè)對(duì)象拿到的都是同一個(gè)vptr、同一張?zhí)摫怼?.3 有虛函數(shù)的類內(nèi)存里多了一個(gè)“看不見(jiàn)的成員”前面提到vptr它是個(gè)隱藏成員不寫(xiě)在類定義里但每個(gè)對(duì)象都有。這讓不少初學(xué)C的朋友踩過(guò)一個(gè)經(jīng)典坑sizeof算出來(lái)比自己聲明的成員變量總和要多卻找不到多出來(lái)的變量在哪。我舉個(gè)例子。一個(gè)類只聲明了int id;直覺(jué)上大小是4字節(jié)但一旦它帶有虛函數(shù)64位平臺(tái)下sizeof通常是16字節(jié)4字節(jié)的int加上8字節(jié)的vptr加上對(duì)齊填充。拿這個(gè)類去初始化一個(gè)字節(jié)流緩沖區(qū)、寫(xiě)入文件、網(wǎng)絡(luò)傳輸再在原平臺(tái)反序列化如果處理得不對(duì)讀回來(lái)的對(duì)象vptr是指向非法地址的后續(xù)一調(diào)虛函數(shù)就崩。這里補(bǔ)充一句vptr的初始化是在構(gòu)造函數(shù)里完成的編譯器會(huì)在構(gòu)造函數(shù)的最開(kāi)始插入“將vptr指向本類虛表”的指令。這個(gè)時(shí)機(jī)非常關(guān)鍵也是后面要講的“構(gòu)造函數(shù)里調(diào)虛函數(shù)為什么不靈”的根本原因。所以給業(yè)務(wù)類設(shè)計(jì)是否虛函數(shù)不只是代碼風(fēng)格問(wèn)題還牽涉到內(nèi)存布局、跨語(yǔ)言交互、底層序列化等一系列問(wèn)題。凡是要做數(shù)據(jù)落地的類我建議先問(wèn)自己它真的需要多態(tài)嗎如果只是為了讓某個(gè)字段被子類替換那用一個(gè)虛函數(shù)接口的成本可能比記錄下來(lái)還要高。2. 動(dòng)態(tài)綁定的運(yùn)行時(shí)真相2.1 vptr的構(gòu)造順序?yàn)槭裁礃?gòu)造函數(shù)里調(diào)虛函數(shù)是“假多態(tài)”有經(jīng)驗(yàn)的面試官很喜歡問(wèn)一個(gè)問(wèn)題基類構(gòu)造函數(shù)里調(diào)用虛函數(shù)會(huì)調(diào)用到派生類的覆寫(xiě)版本嗎答案是不會(huì)調(diào)用的是基類版本。原因就落在vptr的初始化順序上。構(gòu)造一個(gè)派生類對(duì)象時(shí)編譯器會(huì)先構(gòu)造基類子對(duì)象再構(gòu)造派生類自己的部分。這里有個(gè)關(guān)鍵機(jī)制在基類構(gòu)造函數(shù)執(zhí)行期間vptr被設(shè)置為指向基類的虛表而不是派生類的虛表。也就是說(shuō)當(dāng)基類構(gòu)造函數(shù)體內(nèi)的代碼執(zhí)行到對(duì)虛函數(shù)的調(diào)用時(shí)對(duì)象“當(dāng)前身份”還是基類動(dòng)態(tài)綁定在這個(gè)階段看起來(lái)失效了實(shí)際上它是按照當(dāng)前構(gòu)造層級(jí)正確工作的。等到基類構(gòu)造完成進(jìn)入派生類構(gòu)造函數(shù)體之前vptr才會(huì)被更新為指向派生類的虛表。所以構(gòu)造函數(shù)的執(zhí)行順序決定了你只能在“自己那層”調(diào)用到自己那層的虛函數(shù)實(shí)現(xiàn)規(guī)律是從基類往派生類逐步“變身”。析構(gòu)順序則完全反過(guò)來(lái)析構(gòu)時(shí)vptr先保持派生類虛表進(jìn)入派生類析構(gòu)體后再隨著析構(gòu)退出逐步切回基類虛表最后銷(xiāo)毀整個(gè)對(duì)象。這樣的設(shè)計(jì)看起來(lái)有點(diǎn)反直覺(jué)但它是安全的。試想如果基類構(gòu)造函數(shù)在對(duì)象還沒(méi)完全構(gòu)造好時(shí)就調(diào)用了一個(gè)依賴派生類成員狀態(tài)的虛函數(shù)結(jié)果一定會(huì)在真隨機(jī)的時(shí)間點(diǎn)崩潰。C選擇不讓這種情況發(fā)生代價(jià)就是構(gòu)造函數(shù)里的虛函數(shù)調(diào)用不具有動(dòng)態(tài)性。工程上的教訓(xùn)是不要在構(gòu)造函數(shù)里依賴多態(tài)行為。如果派生類確實(shí)需要“構(gòu)造時(shí)執(zhí)行自定義邏輯”更穩(wěn)妥的做法是用一個(gè)非虛的公共構(gòu)造函數(shù)封裝之后單獨(dú)暴露init()之類的接口讓派生類覆寫(xiě)再由外部在構(gòu)造完成后顯式調(diào)用。這個(gè)方法雖然多一步但行為明確也方便在初始化失敗時(shí)處理異常。2.2 純虛函數(shù)、抽象類與設(shè)計(jì)約束純虛函數(shù)是C多態(tài)里最接近“接口”概念的東西。聲明方式是在虛函數(shù)末尾加 0它表示“本類不提供該函數(shù)的實(shí)現(xiàn)派生類必須實(shí)現(xiàn)”。含有純虛函數(shù)的類就是抽象類不能直接實(shí)例化。注意不能實(shí)例化不是“編譯器隨手?jǐn)r住”而是因?yàn)閷?duì)象構(gòu)造時(shí)無(wú)法確定虛函數(shù)的入口地址表項(xiàng)懸空的話對(duì)象里的vptr就沒(méi)有完整意義。我常在設(shè)計(jì)里用純虛函數(shù)來(lái)定義業(yè)務(wù)契約。例如一個(gè)支付模塊定義了submit()、query()、refund()三個(gè)純虛函數(shù)各支付渠道自己去實(shí)現(xiàn)。這樣上層業(yè)務(wù)流程只依賴這個(gè)抽象接口完全不感知具體渠道存在。新增一個(gè)渠道只需要添加一個(gè)派生類不用改動(dòng)任何調(diào)用代碼。這符合面向?qū)ο罄铩伴_(kāi)閉原則”的直觀表述對(duì)擴(kuò)展開(kāi)放對(duì)修改關(guān)閉。純虛函數(shù)還有一個(gè)容易被忽視的用法可以在基類中給純虛函數(shù)提供函數(shù)體。是的純虛函數(shù)也可以有實(shí)現(xiàn)但派生類仍然必須覆寫(xiě)它才能在對(duì)象里獲得可調(diào)用版本。派生類實(shí)現(xiàn)里如果想復(fù)用基類邏輯可以顯式調(diào)用Base::pureFunc()。這種寫(xiě)法適合做一些公共的兜底邏輯但使用頻率不高。另一個(gè)常見(jiàn)操作是定義純虛析構(gòu)函數(shù)。語(yǔ)法上析構(gòu)函數(shù)可以是純虛函數(shù)但你必須為它提供實(shí)現(xiàn)否則任何派生類析構(gòu)時(shí)鏈接器都找不到基類析構(gòu)函數(shù)體直接報(bào)錯(cuò)。原因很簡(jiǎn)單析構(gòu)永遠(yuǎn)要一層層執(zhí)行到基類定義純虛析構(gòu)而不給實(shí)現(xiàn)基類那層就“無(wú)函數(shù)可調(diào)”了。很多人知道“基類析構(gòu)函數(shù)要加virtual”卻不知道純虛析構(gòu)還必須給函數(shù)體這也是一個(gè)高頻面試陷阱。2.3 析構(gòu)函數(shù)必須是虛函數(shù)的理由當(dāng)一個(gè)類要被繼承、且你打算用基類指針管理對(duì)象時(shí)析構(gòu)函數(shù)應(yīng)當(dāng)聲明為virtual。這條規(guī)則幾乎無(wú)人質(zhì)疑但背后原因值得展開(kāi)??紤]一段代碼Base* p new Derived();最后執(zhí)行delete p;。如果Base的析構(gòu)函數(shù)不是虛函數(shù)delete的行為由靜態(tài)類型決定——編譯器認(rèn)為p是Base*于是只調(diào)用Base的析構(gòu)函數(shù)。但p實(shí)際上指向的是Derived對(duì)象Derived部分占用的資源、它自己的析構(gòu)邏輯全部不會(huì)被執(zhí)行。這在內(nèi)存和資源上輕則泄漏重則導(dǎo)致程序在退出階段崩潰。如果Base的析構(gòu)函數(shù)是虛函數(shù)delete會(huì)經(jīng)過(guò)動(dòng)態(tài)綁定找到對(duì)象的真實(shí)類型先調(diào)用Derived析構(gòu)函數(shù)再按層級(jí)向上調(diào)用Base析構(gòu)函數(shù)完整釋放整個(gè)對(duì)象。這也是“析構(gòu)與構(gòu)造順序相反”的原因所在。這里需要強(qiáng)調(diào)一個(gè)邊界不打算作為多態(tài)基類使用的類沒(méi)必要把析構(gòu)函數(shù)寫(xiě)成virtual。因?yàn)橐坏┞暶魈撐鰳?gòu)函數(shù)類就會(huì)引入vptr對(duì)象體積變大且破壞原本可能是POD的內(nèi)存布局。換句話說(shuō)virtual析構(gòu)函數(shù)是“我要把對(duì)象當(dāng)作多態(tài)對(duì)象來(lái)管理”的聲明使用它是有代價(jià)的。工程上如果拿不準(zhǔn)“這個(gè)類以后會(huì)不會(huì)被繼承”目前我傾向的做法是默認(rèn)不加虛析構(gòu)等到確實(shí)出現(xiàn)基類指針刪除派生類對(duì)象的需求時(shí)再補(bǔ)上。盲目全加virtual除了增大內(nèi)存占用還會(huì)讓結(jié)構(gòu)體無(wú)法被某些C庫(kù)接口直接傳遞。保持克制比“肯定不會(huì)有問(wèn)題”的心態(tài)更可靠。3. 把動(dòng)態(tài)綁定真正落到工程代碼里3.1 一個(gè)最小但完整的示例理論講完看一段可以直接跑的示例代碼。這個(gè)例子很小但覆蓋了“基類指針調(diào)用派生類覆寫(xiě)函數(shù)”的全部關(guān)鍵環(huán)節(jié)。#include iostream #include memory class Animal { public: virtual void speak() const { std::cout Animal speaks. std::endl; } virtual ~Animal() default; }; class Dog : public Animal { public: void speak() const override { std::cout Dog barks. std::endl; } }; class Cat : public Animal { public: void speak() const override { std::cout Cat meows. std::endl; } }; void talk(const Animal animal) { animal.speak(); // 動(dòng)態(tài)綁定 } int main() { Dog dog; Cat cat; talk(dog); talk(cat); std::unique_ptrAnimal p std::make_uniqueDog(); p-speak(); return 0; }運(yùn)行結(jié)果是三行不同叫聲各自對(duì)應(yīng)實(shí)際對(duì)象類型。細(xì)看這段代碼有兩個(gè)我特意留下的細(xì)節(jié)。第一個(gè)是override關(guān)鍵字它讓編譯器幫助檢查派生類覆寫(xiě)是否符合基類虛函數(shù)簽名。如果我在Dog里把speak()的參數(shù)改成int x編譯器會(huì)直接報(bào)錯(cuò)而不是讓代碼帶著一個(gè)“看起來(lái)正確但實(shí)際不執(zhí)行動(dòng)態(tài)綁定”的隱藏函數(shù)。第二個(gè)是虛析構(gòu)配合std::unique_ptrAnimal使用。如果不加virtual析構(gòu)unique_ptrAnimal刪除Dog對(duì)象時(shí)同樣會(huì)面臨前面說(shuō)的只析構(gòu)基類部分的問(wèn)題。日常項(xiàng)目里我更推薦在參數(shù)傳遞上用const Animal而不是裸指針。原因有兩個(gè)一是引用天然不為空少一類“空指針判斷”的臟代碼二是const限制調(diào)用方不能修改對(duì)象內(nèi)部狀態(tài)對(duì)接口約束更清晰。傳入引用時(shí)同樣觸發(fā)動(dòng)態(tài)綁定動(dòng)態(tài)性不依賴傳參方式。3.2 override、final、默認(rèn)實(shí)參三個(gè)容易翻車(chē)的細(xì)節(jié)多態(tài)語(yǔ)法看起來(lái)磕到頭就完事但有三個(gè)細(xì)節(jié)常讓人調(diào)試到懷疑人生。第一個(gè)是隱藏與覆蓋的區(qū)別。派生類里定義一個(gè)與基類虛函數(shù)同名但參數(shù)不同的函數(shù)不會(huì)覆蓋基類版本而是隱藏基類的所有同名函數(shù)。比如基類有virtual void draw(int);派生類寫(xiě)void draw(double);通過(guò)基類指針調(diào)用p-draw(42)時(shí)靜態(tài)度量依然調(diào)用draw(int)動(dòng)態(tài)分發(fā)完全沒(méi)發(fā)生。如果要覆寫(xiě)必須保證函數(shù)簽名完全一致否則就用using Base::draw;顯式引入基類同名函數(shù)。第二個(gè)是默認(rèn)實(shí)參的靜態(tài)綁定問(wèn)題??催@段代碼class Base { public: virtual void f(int x 1) const { std::cout x; } }; class Derived : public Base { public: void f(int x 2) const override { std::cout x; } }; Base* p new Derived(); p-f(); // 輸出2還是1答案是輸出2派生類實(shí)現(xiàn)但實(shí)參取自Base的默認(rèn)值1。因?yàn)槟J(rèn)實(shí)參在編譯期解析編譯器按p的靜態(tài)類型Base去確定x1而函數(shù)體執(zhí)行走動(dòng)態(tài)綁定調(diào)用Derived::f于是得到x1。這在代碼里很容易讓人困惑。我的建議是不要在虛函數(shù)里使用默認(rèn)實(shí)參寧可寫(xiě)一個(gè)非虛的公開(kāi)函數(shù)轉(zhuǎn)發(fā)到私有虛函數(shù)把默認(rèn)值放在非虛層。第三個(gè)是final的用法。它有兩個(gè)位置類名后跟class FinalCls final表示該類不能繼續(xù)被繼承函數(shù)后跟void f() final表示該虛函數(shù)不能再被覆寫(xiě)。final的價(jià)值不僅是限制別人也是在團(tuán)隊(duì)協(xié)作時(shí)明確表達(dá)“這個(gè)擴(kuò)展點(diǎn)就到此為止”的意圖。它還能讓編譯器在某些情況下做更激進(jìn)的優(yōu)化因?yàn)榫幾g器知道了繼承不會(huì)再加深雖然實(shí)際優(yōu)化效果有限。3.3 dynamic_cast、typeid 與運(yùn)行時(shí)類型識(shí)別程序運(yùn)行到某個(gè)環(huán)節(jié)確實(shí)需要確認(rèn)“這個(gè)對(duì)象到底是什么類型”時(shí)C提供了dynamic_cast和typeid。二者都依賴RTTI運(yùn)行時(shí)類型信息而RTTI只對(duì)帶虛函數(shù)的類生效。普通類沒(méi)有多態(tài)能力也就沒(méi)有可靠的運(yùn)行時(shí)類型信息。dynamic_cast最常見(jiàn)的用法是把基類指針/引用安全地轉(zhuǎn)為派生類指針/引用。指針轉(zhuǎn)型失敗返回nullptr引用轉(zhuǎn)型失敗拋std::bad_cast異常。它在多級(jí)繼承和交叉轉(zhuǎn)型時(shí)可以沿著繼承關(guān)系行走比static_cast在運(yùn)行時(shí)穩(wěn)定得多。static_cast不會(huì)檢查實(shí)際類型在已知類型信息時(shí)雖然快但一旦類型判斷失誤后果是未定義行為。typeid則返回一個(gè)std::type_info對(duì)象可以直接比較或讀取類型名稱。它適合做日志輸出、斷言、診斷但我不建議把它寫(xiě)進(jìn)業(yè)務(wù)判斷分支。一個(gè)系統(tǒng)里如果到處是if (typeid(*p) typeid(Dog))說(shuō)明接口抽象得不夠把“對(duì)象是什么”的判斷強(qiáng)插進(jìn)了調(diào)用方。更好的方向是給公共基類補(bǔ)充一個(gè)行為接口讓調(diào)用方只問(wèn)“你能不能做這件事”而不是問(wèn)“你是誰(shuí)”。關(guān)于dynamic_cast還有一條工程經(jīng)驗(yàn)如果某處必須用dynamic_cast向下轉(zhuǎn)型我會(huì)盡量把它封裝在基類的某個(gè)虛函數(shù)接口之后或者放在緊挨對(duì)象創(chuàng)建的局部區(qū)域限制它的擴(kuò)散范圍。這樣既拿到具體派生類的能力又不讓類型檢查污染整體架構(gòu)。4. 性能考量與模板多態(tài)的取舍4.1 一次虛函數(shù)調(diào)用的真實(shí)成本討論動(dòng)態(tài)綁定沒(méi)法回避性能問(wèn)題。我常被問(wèn)“虛函數(shù)是不是很慢”。直接回答單次調(diào)用很便宜但代價(jià)真實(shí)存在。一次普通函數(shù)調(diào)用是編譯期直接生成跳轉(zhuǎn)指令調(diào)用地址在指令里寫(xiě)死。一次虛函數(shù)調(diào)用要先加載對(duì)象的vptr再根據(jù)函數(shù)在虛表中的偏移讀取入口地址然后間接跳轉(zhuǎn)。多出來(lái)的操作一般只有幾次內(nèi)存訪問(wèn)和一個(gè)間接跳轉(zhuǎn)單看絕對(duì)時(shí)間在熱緩存場(chǎng)景下往往只有幾納秒。真正的成本有兩點(diǎn)。第一虛函數(shù)無(wú)法在編譯期被內(nèi)聯(lián)。內(nèi)聯(lián)是編譯器最有效的優(yōu)化手段之一虛函數(shù)調(diào)用阻斷了這個(gè)路徑某些高頻小函數(shù)因?yàn)闊o(wú)法內(nèi)聯(lián)性能損失會(huì)放大。第二間接跳轉(zhuǎn)會(huì)干擾現(xiàn)代CPU的分支預(yù)測(cè)。當(dāng)循環(huán)里交替處理不同派生類對(duì)象時(shí)同一位置的虛調(diào)用入口不斷變化CPU預(yù)測(cè)失敗的代價(jià)可能讓整體吞吐明顯下降。我實(shí)際調(diào)整過(guò)一個(gè)幀循環(huán)里大量高頻調(diào)用的模塊里面幾個(gè)接口是虛函數(shù)每次迭代都要觸發(fā)多次動(dòng)態(tài)分發(fā)。把這個(gè)環(huán)節(jié)改成模板化靜態(tài)多態(tài)后同一功能的吞吐量提升了大約三成。但這不代表“虛函數(shù)就該被抵制”因?yàn)槟谴纹款i出現(xiàn)在“調(diào)用次數(shù)極端密集 對(duì)象類型在循環(huán)內(nèi)頻繁切換 函數(shù)體本身很小”的組合條件下。業(yè)務(wù)代碼里大多數(shù)虛函數(shù)調(diào)用不是熱點(diǎn)優(yōu)化它們往往吃力不討好。做性能取舍時(shí)我的習(xí)慣是先profile確認(rèn)某個(gè)函數(shù)確實(shí)在熱點(diǎn)路徑上再?zèng)Q定是否調(diào)整。寧可多寫(xiě)一點(diǎn)模板代碼也不要憑空臆想“這里少一個(gè)虛調(diào)用就快了”。盲目用宏或硬編碼替掉虛函數(shù)最后通常只換來(lái)一份更脆弱、更難維護(hù)的代碼。4.2 何時(shí)選擇模板/編譯期多態(tài)何時(shí)必須用虛函數(shù)C有兩種多態(tài)途徑運(yùn)行期動(dòng)態(tài)綁定虛函數(shù)編譯期靜態(tài)多態(tài)模板、CRTP。兩者不是替代關(guān)系而是分工不同。虛函數(shù)適合“運(yùn)行時(shí)類型未知、需要延遲決定”的場(chǎng)景模板適合“編譯期就能確定類型集合、追求性能邊界”的場(chǎng)景。判斷標(biāo)準(zhǔn)可以這樣簡(jiǎn)化如果變化發(fā)生在運(yùn)行期比如插件加載、用戶自定義類型、跨模塊回調(diào)選虛函數(shù)。如果變化僅僅發(fā)生在編譯期比如一個(gè)算法需要適配多種數(shù)值類型選模板。一個(gè)經(jīng)典例子是std::sort使用模板實(shí)現(xiàn)因?yàn)樗獙?duì)各種隨機(jī)訪問(wèn)迭代器類型做編譯期優(yōu)化而GUI框架事件回調(diào)普遍使用多態(tài)因?yàn)榘粹o點(diǎn)擊時(shí)到底執(zhí)行哪一個(gè)業(yè)務(wù)動(dòng)作只有運(yùn)行時(shí)才知道。還有一個(gè)介于兩者之間的工具是std::function。它本身不要求參數(shù)類型有繼承關(guān)系只要可調(diào)用對(duì)象簽名匹配就能賦值。它內(nèi)部通過(guò)類型擦除包裝不同可調(diào)用對(duì)象對(duì)外屏蔽具體類型。這相當(dāng)于“基于值語(yǔ)義的多態(tài)”在很多場(chǎng)景里比虛函數(shù)更靈活尤其適合做回調(diào)注冊(cè)。代價(jià)是類型擦除可能產(chǎn)生堆分配性能敏感時(shí)需要測(cè)試。關(guān)于“不要亂用虛函數(shù)”我更想表達(dá)的是多態(tài)的價(jià)值在于把一種調(diào)用方契約和多種實(shí)現(xiàn)之間的綁定關(guān)系交給運(yùn)行時(shí)管理。如果某個(gè)類的派生類版本永遠(yuǎn)只有兩三個(gè)而且在編譯期就能確定當(dāng)前調(diào)用時(shí)間點(diǎn)的具體類型那虛函數(shù)的動(dòng)態(tài)性就有點(diǎn)“過(guò)度供給”。真實(shí)系統(tǒng)往往是混用的公共接口層用抽象類定義契約高頻計(jì)算內(nèi)核用模板或普通函數(shù)。兩種方式兼容得很好重點(diǎn)是意識(shí)到邊界在哪。5. 工程中常見(jiàn)的高頻坑與排查思路5.1 delete基類指針導(dǎo)致派生類析構(gòu)沒(méi)執(zhí)行這個(gè)坑的威力不在于代碼難懂而在于它觸發(fā)時(shí)往往不在現(xiàn)場(chǎng)。排查場(chǎng)景一般是程序跑了一段時(shí)間內(nèi)存持續(xù)增長(zhǎng)或者派生類持有文件句柄、網(wǎng)絡(luò)連接關(guān)閉時(shí)沒(méi)有釋放導(dǎo)致后續(xù)操作失敗。定位時(shí)發(fā)現(xiàn)某個(gè)基類析構(gòu)函數(shù)前少了virtual于是delete基類指針時(shí)只銷(xiāo)毀了基類部分。修復(fù)方式很直接給析構(gòu)函數(shù)加virtual。還有一種更穩(wěn)妥的工程習(xí)慣是全程使用智能指針管理多態(tài)對(duì)象。std::shared_ptrBase在創(chuàng)建時(shí)如果傳入的是Derived*刪除器會(huì)綁定到Derived的析構(gòu)函數(shù)即使基類析構(gòu)不是虛函數(shù)也能正確釋放派生類資源。注意這里有個(gè)陷阱如果先拿Derived*構(gòu)造shared_ptrBase刪除器是完整的如果先拿到shared_ptrDerived再隱式轉(zhuǎn)換成shared_ptrBase同樣保留正確的類型擦除刪除器。但如果是用shared_ptrBase(new Derived)也能正確只有把原始Derived*直接賦給裸指針再手動(dòng)delete才存在風(fēng)險(xiǎn)。總之用智能指針能規(guī)避掉相當(dāng)一部分此類問(wèn)題。5.2 構(gòu)造函數(shù)里調(diào)用虛函數(shù)行為不符合預(yù)期這類問(wèn)題通常出現(xiàn)得很隱蔽。比如某個(gè)監(jiān)控框架在基類構(gòu)造函數(shù)里調(diào)用了report()虛函數(shù)原本希望子類覆寫(xiě)后上報(bào)自定義信息結(jié)果跑起來(lái)發(fā)現(xiàn)上報(bào)的全是默認(rèn)值。原因正如前面分析的基類構(gòu)造階段vptr還指向基類虛表虛調(diào)用不會(huì)進(jìn)入派生類版本。修正方案有兩個(gè)方向。如果邏輯確實(shí)需要在對(duì)象構(gòu)造完成后執(zhí)行就改成在派生類構(gòu)造函數(shù)的函數(shù)體末尾顯式調(diào)用或用單獨(dú)的init()接口。如果邏輯只能在基類構(gòu)造階段執(zhí)行那就直接調(diào)用基類版本不要指望動(dòng)態(tài)綁定。還有一個(gè)小技巧在基類構(gòu)造函數(shù)里調(diào)用一個(gè)純虛函數(shù)會(huì)導(dǎo)致程序崩潰或未定義行為因?yàn)榇藭r(shí)虛表中該項(xiàng)是空的所以這種行為是明確的禁忌。排查時(shí)先確認(rèn)調(diào)用點(diǎn)是在構(gòu)造函數(shù)內(nèi)還是構(gòu)造函數(shù)后可以省掉很多無(wú)謂的猜測(cè)。5.3 庫(kù)接口中增刪虛函數(shù)引發(fā)二進(jìn)制兼容問(wèn)題這一條主要針對(duì)要發(fā)布庫(kù)的團(tuán)隊(duì)。假設(shè)你的庫(kù)給外部模塊使用大家已經(jīng)基于你的頭文件和編譯產(chǎn)物鏈接運(yùn)行。你在新版里往某個(gè)公共基類新增了一個(gè)虛函數(shù)或者調(diào)整了虛函數(shù)的順序那么虛表布局就變了。舊版客戶端模塊用的是舊虛表布局兩者一混合調(diào)用虛函數(shù)時(shí)會(huì)拿到錯(cuò)位的表項(xiàng)地址結(jié)果是難以預(yù)料的崩潰或靜默邏輯錯(cuò)誤。這就是為什么很多穩(wěn)定庫(kù)對(duì)公共類的改動(dòng)極其謹(jǐn)慎。要擴(kuò)展接口時(shí)更安全的是新增一個(gè)單獨(dú)的接口類或者用pImpl模式把實(shí)現(xiàn)細(xì)節(jié)藏起來(lái)讓對(duì)外類保持穩(wěn)定的內(nèi)存布局。至少在增刪虛函數(shù)前必須確認(rèn)上下游模塊統(tǒng)一重新編譯。這類問(wèn)題在編譯好的二進(jìn)制環(huán)境下尤其隱蔽因?yàn)樗粫?huì)在編譯期報(bào)錯(cuò)只在運(yùn)行期莫名崩塌。我在實(shí)際維護(hù)一個(gè)跨平臺(tái)模塊時(shí)就吃過(guò)一次虧新版頭文件里給抽象接口加了一個(gè)帶默認(rèn)實(shí)現(xiàn)的虛函數(shù)我在本地重新編譯后一切正常但把庫(kù)發(fā)出去后舊版調(diào)用方的運(yùn)行日志里開(kāi)始零星出現(xiàn)棧錯(cuò)亂。排查到最后根源就是那個(gè)新增的虛函數(shù)改變了虛表偏移。從那以后我對(duì)公共接口的虛函數(shù)表逢改必查影響面能不加就不加能新增獨(dú)立接口類就絕不往老類身上疊虛函數(shù)。排查多態(tài)相關(guān)問(wèn)題時(shí)還有一條經(jīng)驗(yàn)值得分享遇到詭異崩潰先看是否涉及相同內(nèi)存被多種類型解釋再看構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用順序最后檢查vptr是不是在奇怪的時(shí)間點(diǎn)被改寫(xiě)。大多數(shù)虛調(diào)用崩潰都繞不開(kāi)這三個(gè)方向。把動(dòng)態(tài)綁定背后的內(nèi)存布局和對(duì)象生命周期想清楚踩坑的頻率會(huì)顯著下降。我在實(shí)際調(diào)試?yán)锏捏w會(huì)是真正讓人痛苦的不是語(yǔ)法沒(méi)記住而是把一個(gè)靜態(tài)世界里的問(wèn)題拿到運(yùn)行時(shí)視角里去分析時(shí)還缺那一層直覺(jué)。多寫(xiě)幾個(gè)帶vptr的類、沒(méi)事打印一下對(duì)象大小和類型信息這種直覺(jué)慢慢就養(yǎng)出來(lái)了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
射丝袜高跟鞋99| 亚洲三区视频| 国产v片在线免费观看| 青草影院内射高潮| 久久老熟女| 激情色播| 日韩97在线| 97视频观看| 久久精品久久九九精品| 精品视频一区二区| 日韩pv中文| 91精品久久久久| 日产狠狠干| 九七超碰| 在线小说视频一区| 久久久一级| 综合久久2017| 亚洲诱惑| 婷婷五月天网| 国产美女自拍AV| 色天堂综合| 牛黄色久午久| 日本中文熟女视频| 99热欧美| 欧美色图 人妻| 久久6热视频免费观看| 国产免费内射视频| 中文字幕人乱码中文字的预防方法 | 久久精品一区二区一8| 操B久久| 欧美激情中文字幕另类小说| 欧美强奸乱能| 91成人在线免费视频| 另类老少妇| 精品国产一区二区三区av在线资源| 亚洲成人av电影在线| 欧日韩一二三f区| 久久久精久久久| 欧美一区二区三区大综合| 少妇高潮流水av免费| 黄片www视频免费| 国产精品乱码久久久久久| 久久手机视直播| 一区二区三区在线资源| 一区二区影视| 亚洲高清欧美总合| 久久久久久久97| 人人手机欧洲亚洲国产人妻| 国产精品老师| 成人日韩3| 亚洲超碰97| 欧美精品不卡一二三四在线91| 日本99一区二区| Av色五月| 人妻激情在线视频| 亚洲欧美在线综合| 劲爆欧美人妖三区91| 超碰97人人乐| 美女丝袜激情小说| 欧美色九九| 神马九九| 丰满岳乱妇一区二区三区| 日韩欧美国产高清视频| 欧美很很操视频| 淫妻综合网| 亚洲综合另类欧美久久久| 久操综合在线| 三级三级三级日本99| 艳美熟妇先锋一二三区| 97亚洲一区| 丝袜无码a片| 美腿色图| 春色综合免费| 欧美亚洲综合高清在线| 国产Aα| 成人a级高清视频在线观看| 樱花蜜乳av| 蜜桃av综合网发布| 日本人妻A片成人免费看片| 亚洲无线码一区国产欧美国| 91美女視頻| 骚货操死你| 国产精品日日摸夜夜添骚逼| 四虎永久在线精品免费网址| 黄站在线免费观看| 国产精品成人无码a v毛片| 91狠狠综合久久久| 亚洲欧美在线综合| 一级黄色性爱裸体视频| 九九久久99| 男人网站婷婷| 国产中出内射一区二区| 亚洲成人综合在线| 午夜精品久久久99热蜜桃的功能特点| 午夜一级免费毛片| 久久久久深夜无码| 岛国片国产成人亚洲播放| 性感女人网页在线观看视频| 亚洲小说视频| 91精品久久久久久77777| 蜜桃视频一区二区三区| 欧美性爱第一页久久| 性久久久| 色999人与兽| 嗯嗯嗯啊啊在线观看| 密乳AV免费观看| 国产人妻精品久久久一区二区三区 | 另类欧美色| 欧美成人性爱视频免费观看| 好淫网一二三视区| 欲香欲色综合天天伊人| 人人透人人操| 久久天堂网| 91久久精品中文字幕| 中文字幕乱码人妻一区二区三区,99精品 | 中文字幕第23区| 99这里只有精品国产| 爽 好舒服 无码刺激久久| 久久少妇视频| 亚洲一区中文字幕一区| 亚洲色图 91| 久碰视频| 国产夫妻性生活视频| 日韩精品国产一区二区| 后入式在线免费观看60秒| 丰满美女一级毛片在线播放| 欧美久热| 欧美性xxxxx狂欢| 熟妇人妻一区二区| 欧美操逼熟女| 国内一区二区三区| 色色激情五月天| 亚洲成成熟女人综合一区二区| aaaa黄片| 国产女同在线观看视频| 亚洲日韩青青草色月| 老熟女综合网 | 91热热色| 夜夜高潮夜夜爽高清视频一| 收看日本人日bb| 超碰69| 26uuu国产免费观看| 欧美极品少妇| 国产精品视频播放| 激情久久久| 九九久精品| 五月天社区| 大屁股人妻女教师撅着屁股| 综合色欧美| 视频在线观看一二三区| 极品尤物自安慰| 大干人妻| 最新一二三区视频| 成人无码影片视频在线| 久久精品一区二区三区四区五区| 青青青草伊人精品| 日欧美色| www老逼91| 国产中文字幕曰本毛片| 无码人妻精品一区二区三区99不卡 | 亚洲 中文 欧美 日韩 在线 | 天天操天天舔| 天天看高清麻豆| 亚洲av强奸乱伦| 久久国产在线一区二区| ,国产乱人伦精品一区二区三区| 一级人妻性爱视频| 97这里有精品| 九热超碰| 亚洲自拍欧美国产首页网曝| 人妻啊啊人妻啊| 免费精品人妻一区二区三| 黑人在线91| 99在线观看无大码| 日韩人妻精品中文字幕| 美女人妻色网站| HEYZO高无码国产精品227| 久久超碰网| 亚洲丝袜二区在线| 96精品一区| 97超碰天天爱天天爱| 国产精品视频精品一二| 日韩免费大片一级播放| 婷婷久久五月综合激情| 久久国产乱子伦精品免费女,网站| 1204av韩国| 久久婷婷色综合一区二区三区| h4610国产人妻| 亚洲国产美女久久久久| 国产精品片| 国产2.3.4区| 涩涩久久精品| 欧美色老汉| 九九九九九九九九九九九九九九九女| 97干在线| 人人扣人人操| 欧美日韩中文亚洲v在线综合| 久久久久久久九九九九九九| 秋霞免费无码视频日韩A片| 91美女在线| 久久久999国产| 国产午夜福利合集| 中日992视频| 亚洲综合另类色图| 一区二区三区四区五区久久久久久| 婷婷美人网| 久久国99999| 日本精品88888888| 亚洲一二三四区机械| 熟女人妻久久中文字幕一二区| 日本精品成人无码| 亚洲无码99| 99热色精品| 久99| 亚洲丝袜B诱惑| 国产中午字一暮区| 久久宗合亚洲| 精品一区99999| 99re在线视频国产| 国产自偷| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 日日夜夜干| 97精品国产| 91综合中文字幕| 蜜臀久久99精品久久久久久| 热99这里有精品综合久久 | 日本高清一本二本免费不卡| 国产精品日日摸天天碰| 亚洲精品国产精品成人| 台湾成人无码AV| 亚洲暴力强奸AV| 国产精品久久久无码aV去| 精品人妻一区二区三区四区石在线 | PMv在线观看| 国产对白刺激视频| 久久久久国产精品喷潮免费观看臀| 国产又操| 日韩二级| 综合网亚洲1| 国产精品白丝www| 啪啪综合网| 2017人人操,人人摸| 啪啪资源网| 大香蕉综合网| 一区二区三区四区姦女| 97日韩欧美亚洲| 激情综合网亚洲| 日本熟女中文字幕一区| 久久久激情| av亚洲天堂资源网站| 91 国产丝袜在线播放-百度| 欧美在线 亚洲| 亚洲激情深爱文学小说网站| 精品免费视频国产一区| 嫖老熟女A片一二三区| 婷婷色一区| 999在线电影香蕉| 91少妇香蕉久久精品| 欧美色91| 国产亚洲精品久久久久小| 无码 有码 国产18p| 国产一区二区三区精品观看啪| 色色97爱| 天堂俺去俺来也www久久婷婷| 国产精品人妻无码久久久老鸭窝| 成人性爱视频在线看| 亚洲第一在线视频| 一区二区三区四区久久视1| 成人资源中文字幕在线观看| 嗯啊抽插大香蕉网页| 欧美九九爱| 国产蜜臀精品一区二区尤物| 欧美黄片欧美黄片xxx| 女一区二区| 亚洲中文sv| 九九干| 国产少妇肉丝在线观看| 欧美在线亚洲| 99在线免费观看| 激情婷婷丁香| 91社区拍啪人妻| 亚洲中文字幕乱码无码一区二区| 91 丝袜在线播放| 色噜噜狠狠色综合日日| 97热视频在线观看| 人人玩人人添人人澡免费| 一区二区激情国产熟女 | 哈哈操电影| 一本一道vs波多野结衣| 神马久久69| 在线综合 亚洲 欧美中文字幕| 欧美美女自慰一区二区三区| 啊啊啊在线观看| 丁香五月婷婷啪啪| 777超碰| 九九亚洲视频| 91网站18| 青青草色情网站视频| 天天看夜夜看日日干| 殴美,日韩国产伦精品| 91亚洲网站| 国产精品国产拍高清AV| 91青青在线| 色播五月婷婷| 国产精品久久久久久久无码AV| 久久天天摸| 精品国产av一区二区三区四区入口| av天堂影视中文在字幕在线中文| 欧美国产婷婷久久| 日日夜夜骚| 国产一区二区三区白丝| 成人在线视频一区| 国产乱人伦AVA麻豆软件.| 欧美天天在线| 天天色香欲综合网| 国产家庭乱伦表演| 97AV在线免费观看| 日本精品成人无码| 国产呦精品系列在线观看| 欧亚乱色熟一区二区三四区| 7777奇米影视久久| 91N综合网| 久久的网站啊啊啊啊啊| 一线黄色免费性爱片| 欧美青青草视频| 亚洲色综合| 中文久久| 9999久久久久| 欧美亚州手机在线| 色狠狠 - 百度| 日韩大香蕉AV影片| 亚洲色悠悠久久88| 日韩人妻资源在线看| 精品三级在线专区| 亚洲国产蜜臀系列在线观看| 大香蕉操久久| 天天干人妇| 欧美性爱一区二区| 色拍偷亚洲| 国产精品女同| 亚洲一区二区精品福利| 精品无码秘 人妻一区二区 | 国产三区免费在线观看| 玖玖爱在线视频免费观看| 干美女人妻| 久久精品72| 91操碰| 黄色av网站在线播放| 骚鸭AV| 丰满搜索结果 -第18页- 久久高清无码 | 内射夫妻三片| 97色香蕉| 99色在线| 伊人久久蜜月| 久久超碰免费的| 亚洲免费人妻在| 久久日韩精品一区二区| 91丝袜美女视频| 欧美综合 站| 美女露胸露尿口| 亚洲美女自拍偷拍视频| 色黄污美女啪啪啪免费网站| 91亚洲电影| 天美传媒精品久久视频| 91亚洲欧美综合高清在线| 国产精品久久久久绯色| 久久香蕉国产传媒一区剧情天美| 另类天堂| 99热| av资源在线播放天堂| 2017人人操,人人摸| 亚洲天堂久久久久久粉红视频| 人妻少妇无码| 精品女同一区二区三区| 久欲AV| 国产精品久久久久久久免牛肉蒲团| 天天操av懂色| 无码人妻一区二区一牛影视| 亚洲午夜免费狠狠干| 亚欧国产无码精品在线| 日韩欧美一级特黄大片| 啪啪资源网| 日本操大逼| 久久国产免费激情视频| 日韩人妻一二三区视频| AA级电影三区| 日韩国产成人自拍视频| 把腿张开老子CAO烂你| 26uuu偷拍亚洲欧洲综合| 亚洲无码电影久久久| 亚洲色图综合| 亚洲成人性爱网站在线播放| 日韩欧美aⅴ综合网站发布| 亚洲欧美自拍偷拍| 高清国产av无码| 动漫爆乳3D奶水一区在线观看| 亚洲AV成人无码久久精品播放| 男人的天堂2010| 九九aV| www超碰| 五月婷在线| 麻豆蜜桃视频在线观看 | 26uuu最新| 91P0RNY大屁股人妻| 免费观看网黄| 欧美日韩性爱操大逼| 人妻激情偷乱视三区频一区二区| 开心五月天激情网| 成人综合网 欧美| 亚洲一二三| 青青草导航在线视频| 欧美亚州综合网图片| 草草草视频| 韩国免费播放一级毛片| 国产精品久久久久亚洲av| 色色色色网站| 91老熟女逼| 青娱乐手机日韩在线视频| 欧美色图在线视频少妇| 超碰九7| 91精品女厕偷拍视频| aaaa少妇高潮大片| 少妇国产不卡| 亚洲在钱| 国产精品久久久久无码Av网曝门| JIZZJIZZ国产精品喷水| 欧美性后入| 大干人妻| 中国AV美女| 日本 欧美 国产一区| 中文字幕老熟妇黄色视频| 精品一久久久| 欧美狠狠| 色情成人五月天| 欧美性爱一区二区三区四区 | 九九伊人网| 欧美白嫩女HD| 欧美美女视频| 人妻精品一区二区在线| 欧美天天谢综合网| 男人的天堂va在线| 欧美一区二区三区日韩| 怡红院成人av| 色欲久久久久综合网| 色香色欲天天综合网天天来吧| 岛国小电影| 欧洲亚洲人妻无码久久三区四区| 日熟女| 九九色精品| 97看操| aV中亚| 婷婷五月激情综合| 亚洲加勒比色图| 99久国产精品午夜性色福利| 2001天天操| 亚洲欧洲日韩中文字幕一区| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 免费成人在线观看91| 激情综合五月| 蜜桃久久一区| av天堂手机版追回| 九99久久| 日本午夜操逼| 青草影院内射高潮| 日韩卡一卡二卡三在线| 久久精品国产亚洲AV先锋| 人人妻人人狠人人| 嫩草 我啊~嗯~在线| 亚洲欧美日韩二区视频| 91久久久老司机| 涩综合导航| 精品网站9999| 高清在线不卡一区二区 视频| 欧美性爱97超碰| 欧美 亚洲 在线| 五月天激情国产综合婷婷婷| 97亚洲中文| 五月天成人综合| 国产精品夜夜| 欧美老妇综合网| 久久午夜鲁丝片| 爱欲AV| 伦激情人妻另类人妻| 1204av韩国| 久久成人午夜精品影院| 国产中午字一暮区| 五月激情啪啪| 亚洲黑人在线| 操逼精品视频| 蜜乳av首页| 日韩有码中文字幕女同性恋 | 天天网综合| 免费视频在线观看啊啊啊啊啊| 日韩一级欧美一级国产一级台湾| 亚洲丝袜色图| 国产熟女完整版中字| 人妻天堂网| 伊人一级免费黄片| 欧美精品偷拍| 草莓精品视频| 久久国产乱子伦精品免费女,网站| 五月丁香六月激情| 亚洲天天做日日做天天谢日日| 欧美日韩婷婷中文| 在线观看黄色电话| 精品福利| 天天日熟妇| 操狠狠| 国产9 9在线 | 亚洲| 在线情色电影 91大 | 欧美AB在线| 国产综合久久久鬼色| 国产精品色片一区二区| 屁股久久久久久久| 九九九九九九九| 黄污污污污| 国产精品婬乱一级毛片彝族| 亚洲国产精品无石码久久| 久久綜合很很很| 国产亚洲99久久精品| 日韩强奸av| 夜夜高潮夜夜爽夜夜爱爱一区 | 男人天堂电影院| 激情小说亚洲视频| 图色综合网| av资源在线观看少妇| 欧美福利视频啊啊啊啊| 青青草久草| 精彩久久中文| 老熟妇综合| 午夜精品久久久久久久男人的天堂 | 成人性爱美曰韩| 蜜臀久久99精品久久久电影| 精品一区二区2| 日韩ab网| 在线 亚洲 网爆 自拍| 91|九色|国产熟女| 日本天天操| 少妇厨房愉情理伦片bd在线观看| 99re在线| se..亚洲欧美| 老熟乱一区二区三区四区| 91久久堂| 福利天堂| 综合天天网| 91成人在线| 国产怡红院| 淫妻综合网| 99视频内射三四| 亚洲最大的综合性av| 欧美国产精品| 日韩在线性爱免费视频| 亚洲欧美精品国产一区二区| 亚洲中字幕日本一区二区三区| 97超级久久| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 久久久999国产| julia ann久久| 狠狠干2020| 99热18这里只有精品| 东北女人| 中国熟女91| 黑人干亚洲| 91劲爆| 爱丝福利| 96超碰网| 国产一区二区二区按摩精品啪视频| 97这里有精品| 97欧美| 日本操逼视频免费| 超碰在线人妻中文字幕| 亚洲成人性爱网站在线播放| 蜜桃视频成a人v在线| 久久美女国产| 欧美特大黄一级片片免费| 综合自拍| 欧美另类色图片| 黄页18禁| 99热这里只有是精品10| 欧美黑人168页欧美黑人167| 岛国天天午夜影院传媒网| 操熟女91| 欧美大香蕉久| 成人三一级一片aaa| 亚洲九月丁香| 国产精品一二三区福利| 成人色女网| 日日碰视频网| 五月亭亭六月丁香| 国产精品久久99日日| 国产超碰人人操| 精品久久99| 欧美天天综合站| 欧美亚洲系列| 国产精品蜜臀久久久久无码AV| 久久激情亚洲精品无码?V| av大香蕉| 性交一区二区在线播放| 91性情| 久久亚州精品成人Av无| 久久99视频| 99re不伦| 亚洲午夜精品久久久中文影院| 婷婷伊人五月| 岛国精品视频在线观看| 亚洲激情网一二三四区| 久久久人妻| 91夜色chaopeng| 蜜臀一二三区| 日本乱人伦片中文三区| 久草免费在线一区二区| 天天日日日射| 综合色欧美| 色嗨嗨在线| 日韩97视频!在线| 国产一| 视频国产成人精品日本亚洲18| 国产一区二区av综合| 97中文字幕色| 老熟女91视频| 性爱乱伦网址| 99精品网站| 青青草国产欧美非洲黑人| 国模无码一区二区三区在线| 大香蕉 222| 天天看片青娱乐| 国产精品久久成人免费| 91国产美女丝袜足交精品视频| 男人综合网| 亚洲一本色道中文无码aV天美| 亚洲一二三精品久久网 | 日韩视频啪啪| 伊人精品视频| 久久在线观看免费视频| 婷婷激情啪啪| 人妻熟女一区二区三区视频| 国产色呦呦| 另类 综合 日韩 欧美 亚洲| 欧美日韩国产一区二区小黄片大全| 狠狠干,狠狠操| 超碰97极品9| 极品尤物女神在线观看| 日本熟妇精品九九| 日本不卡高清视频| 狠狠躁日日躁夜夜躁A| 嫩呦国产一区二区三区AV| 91精品人妻一区二区三区蜜桃臀| 国产精品美女| 无码欧美有限公司| 久操91视频| 色999人与兽| 亚洲se91| 日本久操视频| 91天天| 老鸭窝亚洲毛片| 日韩99神马视频播放片在线播放| 久久久久久九九九九-美女久久久久久久-成人AV | 欧美亚洲第1页| 国产1024在线播放| 乱理日韩中文| 粉嫩av久久一区二区三区| 懂色AV中文| 韩国黄片aaaa| 大香蕉日韩欧美| 六月激情婷婷| 欧亚日韩中文在线| 夜夜高潮夜夜爽高清视频一| 国产成人99久久亚洲综合| 黑人与人妻| 无码在线亚洲| 四虎免费在线观看| 日少妇亚洲版| 性色av网站| 97国产精品一区| 日本淫色网| 日本日逼高清| 亚洲狠狠入| 久久这里精品国产99丫e6| 不卡av在线中文字幕| 91女优在线观看 | 91久久久久久久久18| 大香蕉在线86| 久草福利在线资源站| 午夜男人的天堂| 欧美第38页| 免费作爱一级视频| 国产400孕妇孕交群| 嫩草伊人久久精品| 欧美特大黄一级片片免费| 性猛交| 亚洲电影91| 天天日天天插| 久久青青草原免费视频| 老熟乱一区二区三区四区| av操操不卡| 久久综合激情| 最新岛国大片| 欧美在线啊啊| 伊人 俄罗斯 a v| 五月丁香啪啪啪| 久久久亚洲高清不打码| 国产AV中文| 亚洲熟女乱综合一区二区三区 | 91精品婷婷国产综合久久竹菊| 99碰碰| 在线岛| 久久超碰网| 欧亚日本情色| 日本超碰97日韩精品人妻| 婷婷五月天影院| 自拍偷拍 日韩无码| 一中国女人毛片水真多| 亚洲自拍小说| 人人爽人人精品乱人伦AV| 中文字幕第页| 国产综合操逼高清| 伦伦成年午夜免费视频| 欧美视频第二页| 狠操91,com| 久草综合京东| 亚洲综合影院| 久久久免费的精品| 级做a爱无码性色永久免费| 欧美专区17页| 老司机午夜福利视频一区二区| 亚洲 综合 欧美| 色综合尤物| 色乱二区| 日韩欧美午夜视频在线| 日本熟女免费視颖| 内射老妇BBWX0C0CK| 2019天天干| 九月伊人中文字幕| 超碰久超碰久| 亚洲精品蜜桃久久久| 日日干夜夜欢| 亚洲精品不卡一二三区| 91性感网站| 亚洲美女30b| 国产污视频麻豆传媒一区二区| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 午夜性生活av免费在线看| 在线二区不卡| 久久线上视频免费看| 国产美女高潮视频| 激情另类激情| 春色综合网| 97视频在线播放| 精品国产乱码久久| 亚洲欧美国产va在线播放频| dy888午夜老子影视达达兔| 97综合国产| 国产日韩精品suv| 婷婷av在线中文字幕| 国产日韩无码一区二区三区久久区| 欧美日韩大香蕉| 国产高清吃奶免费视频网站| 久久久久久久伊人精品| 欧美极品性爱天天射| 亚洲国产成人精品无码专区| 国产视频一区二区免费| 91chinese在线| 天综合中文| 久久久久久久久久久久久久久乱码| 久久超碰亚洲人| 免费97视频| 少妇的嫩逼图片| 欧美色就是色| 手机在线播放国产福利| 图片区小说区| 日韩欧美亚洲国产日韩| 中文字幕天天操| 久久久久深夜无码| 欧美97爱| 日本欧美一区二区三区免费| 激情专区综合| 欧美九九99久久精品| 午夜后入| 97超碰大| 免费精品中文字幕| 无码99| 97国产亚洲中文在线| 乱伦一二三| 欧美顶级黄色大片免费| 丁香五月天堂网| 精品然女一区二区| 午夜美女诱惑电源网| 日本人妻伦在线中文字幕| av日韩手机在线影视| 国产欧美精品日韩区二区麻豆天美| 精品97久久综合| 国产人妻久久精品一区二区三区| 91P0RNY大屁股人妻| 激情看片网站| 9久久美女首页| sewuyueav| 中国一级特黄大片护士| 鲁鲁色综合网| 欧美黑人168页欧美黑人167| 国产精品爆乳懂色蜜乳| 亚洲国产一区二区三区四区国产| 打av高清| 99re99| 福利色色| 精品一二三区四视频| 啊啊啊网站| 国产无套粉嫩白浆在| 四虎免费看黄| 淫荡网址| 婷婷五月天激情小说| 97热视频在线观看| 亚洲无码国产探花在线观看| 五月天婷婷综合| 韩日精品福利视频一区不卡在线免| 狠狠干91| 开心婷婷五月| 91亚洲丝袜熟女| 欧美激情另类一区二区| 1024亚洲中文字幕久在线看片你懂的 | 夜夜操91744565| 九t超碰| 日本理论在线| 中文字幕一区二区三四五区日日骚| 懂色Av| 久久国产视频性吧 | 黄色电影在线播放综合网站| 国产精品久久发布| 久九九九| 欧美日不卡| 久久无码精品| 大香蕉久久| 欧美春色| 91九色精品熟女内射| 91美女国产在线| 日欧亚洲二三区大片不卡| 69精品人人人人| 国产成人超碰在线| 极品粉嫩一区二区| 囯产精品久久久久久久久久梁医生| 欧美日不卡| 91精品国产一区三一| 午夜精品久久久久久久男人的天堂| 美女好片色日本| 色九九综合| 97免费视频在线| 久久精品人体AV| 日韩无限资源| 澳门人妻久久| 亚洲无无码αⅴ每日更新| 国产精品。| 精品少妇人妻av久久免费| 久久久国产精品亚洲精品| 男人高清无码一区二区| 性九九九九九九| 无码国产精品午夜不卡(| 欧美亚洲特P| 精品夜夜澡人妻无码| 男女啪啪网站免费视频| 久久精品一区| 国产网站在线播放| 99国产精品自在自在| 亚洲欧美经典一区二区| 1区2区3区视频| 91殴美大片| 在线观看AV片| 91丝袜视频在线观看| 91在线免费观看处女| 26uuu偷拍亚洲欧洲综合| 天天爱综合网| 国产原创自拍| 国产传媒午夜理伦精品| 国产亚热在线久久| 亚洲图片欧美日韩| 日本性爱欧美性爱| 一本一道久久综合久久| 亚洲情色91| 日本操色导航| 久久久精精精| 嫩草伊人久久精品| www.国产高潮精品| 成人免费性爱视视| 国产后入清纯| 亚洲人成色9999精品久久| 黄色在线网站| 中文字幕一二三| 丰满精品人妻少妇久久字幕| 久久婷五月| 91亚洲精品青草| 黄色片一区二区三区四区五区| 人伦四五区| 人人爽夜夜操| 色婷婷狠狠| 欧美αv.com| 男人的天堂VA| 91在线/欧洲| 91肏屄网| 婷婷丁香六月天| 午夜激情成人在线观看| 国色综合天| 色综合20p| 亚洲精品97在线| 日本污ww视频网站| 中国一级特黄大片护士 | 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 十八岁啪啪视频免费看| 中出欧美| 亚洲欧美天| 少妇专区一二三四五| WWW4虎| 色婷婷电影网| 亚洲最大网站av| 亚洲一区二区久久久久| 亚洲图片另类| 欧美草草高清日韩视频| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 久久精品中文字幕观看| 久久性爱视频免费看| 久久久日本电影| 清纯唯美综合亚洲| 色悠久久久av| 欧美伦乱爱| 熟女中出视频| 日韩精品高清资源在线| AV中文在线| 性一交一乱一交A片久久四色| 日韩在线一区高清在线| 色婷婷六月丁香七月婷婷| 丝袜美腿亚洲| 天天综合中文字幕 91| 欧美综合综合| 成人资源中文字幕在线观看| 久久久草草精品| 区自美91| 久久一二三四五六七八九区| 色五月激情AV在线| 91无摭挡| 热热色国产一二区AV| 国产精品3| 一区二区亚州激情久婷婷欧美| yy少妇精品久久| 欧美91久久久久| 天天色踪合| 日韩精彩视频| 丝袜加勒比| 欧美综合天堂| 日本色日夜干| 午夜小电影在线插入淫高潮| 人人搞人人插人人操| 十八禁啪啪视频| 亚洲熟妇一,二,三期| 色色毛片| 变态乱伦伪娘灌肠一区二区| 三级特黄60分钟播放| 久久久久久久国产视频| 一级啊性爱在线视频| 久久草大香蕉| 欧美黑人猛交春色影视大全| 日本免费不卡二区| 97精品久久久久久久| 久操网在线| 精品久操| 人妻精品一区二区三区| 电家庭影院午夜69久久夜色精品国产69乱| 91社区伊人| 高清国产成人无码| 五月婷婷丁香中文字幕| www.久久| 91国产大片| 大香蕉在线SuP| 欧美天天搞| 欧美性生活男人的天堂| 人人操人人操草草| 亚洲老熟妇xxx| 久久精品72| 少妇色欲综合网2| 高清孕妇孕交| 九九久久一区二区伦理| 99色天堂| 高潮嗯啊性感美女久久久| 色哟哟精品1精品2| 国产精品熟女一区二区三区| 大香蕉黄色一级片免费看| www色日本| 国产少妇与亚洲av| 久久熟女久| 97亚洲综合影院| 日韩欧美午夜视频在线| 六六久久日韩不卡| 超碰天天操| 久草午夜| 91精品伊人久久久大香线蕉91| 亚洲国产精品久久久久久久久久| 欧美国产一区二区三区麻豆传媒| 超碰精品97| 家庭乱伦国产| 麻豆人妻精品一区二区| 亚洲和欧美裸体美女双飞视频| 精品人妻少妇| 国产传媒操逼视频| 99青草| 中文字幕黄色一起草| 亚洲图片色图欧美另类| 精品精品精品| 羞答答AV中文字| 香蕉黄色一级视频| 久久香蕉国产传媒一区剧情天美| 天美一区在线| 亚洲一卡二卡在线免费| 欧美精品第3页| 亚洲人人夜夜澡人人爽| 日韩av电影成人在线| 国产精品一二三免费网站| 超碰69| 1769国内精品视频| 日本久久久久久久久| 91无码人妻精品一区二区三区蜜桃 | www色日本| 亚洲 欧美 精品专区 极品| 亚洲五月天激情| 中文一区二区| 欧美探花网| 欧美黑人与女人91~| 伊人骚琪琪亚洲天堂网站| 欧美十八禁在线看| 91操人| 欧美日韩在线国产在线| 一区二区蜜臀| 亚洲成人精品在线一区| 九九久久一区二区三区| 亚欧美色| 亚洲 综合 欧美| 国产视频第二页| 91精品久久久久久77777| 中出在线视频| 欧美日韩国内不卡| 加勒比av网| 青娱乐久久艹| 超碰是碰在线观看| 乱伦系列一区二区| 天操天操夜操夜月月年年操操| 一区二区三区成人高清视频| 中文字幕88av在线| 国产精品ⅴ无码大片在线看.| 超碰激情808| 欧美第一页| 91精品人妻一区二区三区蜜桃臀| w w w.久久精品| 超碰在线974| 欧美午夜视频免费观看| 北京美女一区二区| 国产成人午夜视频网址| 亚洲综合图片在线| 亚洲av影院在线观看| 物业黑人 AV一区| www网站黄| 色香天天| 一区二区三区网站日日骚| 农村女一级毛卡片| 久插综合| 亚洲熟女性高潮久久久| 亚洲素人综合| 久久人妻视频| 在线日韩精品一区二区三区| 欧洲乱码视频| 国产精品呦一区二区三区| 夜夜做夜夜爽精品视频| 九九热精品| 久草精品国产99| 中文字幕第23区| 桃花色涩综合影院| 福利视频网站| 黄色十八禁网站| 性爱乱伦网址| 久草午夜| 亚洲精品1区| 五月婷婷激情综合| 成人精品无码| 青草园大香蕉| 95人妻爽爽人人做人人澡| 国产女同在线观看视频| 日本新免费二区三区| 激情综合五月| 黑人美精品 A片| 97国产综合欧美| 色女女女导航| 岛国视频免费在线观看| 国内一级精品| 日欧毛片久久| 成人欧美一区二区三区黑人一| 欧美大波激情xxxx| 偷拍导航视频网站| 91嫩草欧美| 五月丁香色色网| 久久精品日韩| 精品久9| 色偷综合| 大香蕉伊人网WWWn0n| 丰满人妻av一区二区三区| 久久的免费性爱视频| 欧美,亚洲,日韩,v,天堂,手机在线观看| 中文字暮97| 久久欧美性爱视频| 草莓精品视频在线免费观看| 99re黄| 1024午夜激情男人的天堂| 久久免费老司机精品| 在线视频日韩欧美国产| 永久免费av无码网站国产app | 婷婷91| 操逼国产免费| 看日韩黄片| 日日骚网站| 91女优在线观看| 69综合网| 天天影视色香色欲| 日本日皮视频逼| 91精品国产日韩欧美综合| 探花精品 一区二区| 久久精品国产97欧美精品亚洲 | 日韩人妻精品久久久久| 白嫩国模丰满一二三区| 操逼天美3区| 亚洲婷婷综合网| 综合 亚洲 欧美| 蜜臀99久久精品| 风骚少妇视频中文字幕| 亚洲精品欧洲精品| 日本一区二区三区欧美日韩中文字幕| 日本福利二区视频| 国产福利av精彩对白| 韩国一级AAA| 亚洲精品一区二区精品| 国产黄色剧情影片麻豆免费播放| 91精品国产91熟女| 欧美少妇高潮| 4tube欧美女厕所| nuu12国产麻豆精品| 精人妻无码一区二区三区伊人直播| 日本 免费 一区二区三区 久久香蕉 | 天天综合网~69| 亚洲丝袜色| 激情五月天色播| 婷婷五月天社区| 99热精品在线观看| 五月综合激情| 国产999精品久久久久久| 婷婷中文字幕| 加勒比大香蕉视频在线| 久操大香蕉手机视频在线看| 91bbb| 中文字幕乱在线伦视频中文字幕乱码在线| 农村女一级毛卡片| 97精| 国产高清午夜成人在线观看| 国产精品96| 思思热一热婷婷热一热| 女生久久网| 日本成人在线不卡一区二区三区 | 天天日天天色| 蜜桃视频精品一区二区|