日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

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

Effective C++精讀:語(yǔ)言聯(lián)邦、const與初始化實(shí)戰(zhàn)

Effective C++精讀:語(yǔ)言聯(lián)邦、const與初始化實(shí)戰(zhàn) 我很久沒(méi)翻開(kāi)那本橘黃色封面的 C 經(jīng)典了但每當(dāng)身邊有朋友問(wèn)“C 到底應(yīng)該怎么學(xué)”我總會(huì)提起這本書(shū)里的第一章節(jié)“讓自己習(xí)慣 C”。作為 Effective C 55 個(gè)具體做法的開(kāi)篇這一章只有四個(gè)條款卻奠定了整本書(shū)的方法論基礎(chǔ)。這些年我見(jiàn)過(guò)太多人把 C 當(dāng)成一門(mén)“帶類(lèi)的 C”來(lái)寫(xiě)結(jié)果代碼越寫(xiě)越別扭問(wèn)題越查越深也有人一上來(lái)就扎進(jìn)模板元編程連基本對(duì)象生命周期都沒(méi)捋清。這篇摘錄想做的就是把第一章的四個(gè)條款掰開(kāi)揉碎結(jié)合我實(shí)際工程里的經(jīng)驗(yàn)講講每一條規(guī)則背后的“為什么”和落地時(shí)的注意點(diǎn)。如果你正準(zhǔn)備系統(tǒng)地讀 Effective C或者已經(jīng)讀過(guò)但覺(jué)得某些條款沒(méi)吃透這篇文章可以當(dāng)作一份帶注釋的閱讀筆記。書(shū)里每個(gè)條款讀起來(lái)都很短但每一條都能展開(kāi)成一篇長(zhǎng)文我會(huì)盡量用具體代碼和場(chǎng)景把它們講透。1. 航拍視角先認(rèn)清 C 是一個(gè)語(yǔ)言聯(lián)邦而不是一門(mén)單一語(yǔ)言1.1 為什么很多人學(xué) C 越學(xué)越混亂原書(shū)作者在條款 01 里提出了一個(gè)非常經(jīng)典的觀點(diǎn)C 不是一門(mén)單一語(yǔ)言而是由四個(gè)次語(yǔ)言組成的“語(yǔ)言聯(lián)邦”。這四個(gè)次語(yǔ)言分別是C、面向?qū)ο蟮?C、模板 C泛型編程、以及 STL。我第一次讀到這個(gè)說(shuō)法時(shí)覺(jué)得太抽象了但工作幾年后回頭再看這可能是全書(shū)最值得反復(fù)咀嚼的一句話(huà)。很多人覺(jué)得 C 難學(xué)本質(zhì)上是因?yàn)檫@四個(gè)次語(yǔ)言的使用方式、編程范式、慣用法差別太大。用純 C 的思路寫(xiě) C你會(huì)覺(jué)得類(lèi)、命名空間、異常都是多余的負(fù)擔(dān)用面向?qū)ο蟮乃悸酚蔡姿袌?chǎng)景你會(huì)覺(jué)得模板和算法庫(kù)與你格格不入反過(guò)來(lái)如果你一上來(lái)就只用模板元編程那一套又會(huì)把簡(jiǎn)單的業(yè)務(wù)邏輯寫(xiě)得晦澀難懂。問(wèn)題不在于你選錯(cuò)了某一個(gè)范式而在于你沒(méi)有意識(shí)到C 允許你在不同場(chǎng)景下切換到不同范式關(guān)鍵是要知道“現(xiàn)在正站在哪塊領(lǐng)土上”。1.2 四個(gè)次語(yǔ)言分別對(duì)應(yīng)什么樣的編程策略我在讀這個(gè)條款時(shí)給自己畫(huà)了一張“心智地圖”這幾年一直在用可以分享給你次語(yǔ)言核心特征典型場(chǎng)景你的思考方式C無(wú)類(lèi)、無(wú)模板、無(wú)異常面向過(guò)程底層模塊、嵌入式、系統(tǒng)調(diào)用封裝指針、內(nèi)存布局、結(jié)構(gòu)體、全局函數(shù)面向?qū)ο?C類(lèi)、封裝、繼承、多態(tài)、虛函數(shù)業(yè)務(wù)模型、架構(gòu)分層、接口設(shè)計(jì)抽象、對(duì)象生命周期、接口與實(shí)現(xiàn)分離模板 C編譯期計(jì)算、類(lèi)型推導(dǎo)、泛型抽象容器、算法、類(lèi)型安全的工具庫(kù)類(lèi)型層面的復(fù)用、編譯期行為STL容器、迭代器、算法、函數(shù)對(duì)象日常數(shù)據(jù)結(jié)構(gòu)和算法使用迭代器、算法復(fù)雜度、容器的選擇舉個(gè)例子寫(xiě)嵌入式驅(qū)動(dòng)時(shí)我基本在用次語(yǔ)言 C 的方式結(jié)構(gòu)體、位運(yùn)算、函數(shù)指針寫(xiě)一個(gè)大型業(yè)務(wù)系統(tǒng)時(shí)我切換到面向?qū)ο蟮拇握Z(yǔ)言抽象基類(lèi)、虛函數(shù)、工廠(chǎng)模式寫(xiě)一個(gè)通用緩存組件時(shí)我可能大量使用模板和 traits處理一批數(shù)據(jù)時(shí)我直接用 STL 的 vector、sort、find_if。規(guī)則很簡(jiǎn)單當(dāng)遵循某一子語(yǔ)言的規(guī)約時(shí)你就只在這個(gè)子語(yǔ)言的框架內(nèi)思考這樣能顯著降低認(rèn)知負(fù)擔(dān)。條款 01 還提醒了一個(gè)很實(shí)用的點(diǎn)不同次語(yǔ)言的“高效編程守則”不同取決于你用哪種風(fēng)格編程。比如在傳統(tǒng)的 C 部分值傳遞通常沒(méi)問(wèn)題但在面向?qū)ο蟮?C 里值傳遞意味著拷貝構(gòu)造和析構(gòu)的額外開(kāi)銷(xiāo)常量引用往往更合適而在模板代碼里你又得考慮引用折疊和完美轉(zhuǎn)發(fā)。很多人寫(xiě) C 代碼“哪里都別扭”往往不是因?yàn)檎Z(yǔ)法不熟而是因?yàn)闆](méi)有意識(shí)到自己在混合使用多個(gè)子語(yǔ)言卻沒(méi)有切換對(duì)應(yīng)的策略。1.3 用這個(gè)視角重新審視你手頭的代碼讀完這個(gè)條款后我做了一次自查把最近一年寫(xiě)的某個(gè)模塊按四個(gè)次語(yǔ)言分類(lèi)發(fā)現(xiàn)真正屬于“面向?qū)ο?C”的代碼只占三成另外三成是 C 風(fēng)格的實(shí)現(xiàn)四成是 STL 和模板的混合。這個(gè)分類(lèi)幫我找到不少壞味道——比如我在 C 風(fēng)格的模塊里用了 dynamic_cast在泛型代碼里用虛函數(shù)實(shí)現(xiàn)多態(tài)這些都屬于“跨領(lǐng)地操作”雖然能編譯通過(guò)但設(shè)計(jì)上確實(shí)不夠干凈。條款 01 本身沒(méi)有任何代碼示例也不涉及具體語(yǔ)法但它給了你一個(gè)判斷標(biāo)準(zhǔn)當(dāng)你寫(xiě)某段代碼覺(jué)得“別扭”時(shí)先問(wèn)自己四個(gè)問(wèn)題——我在用哪個(gè)次語(yǔ)言寫(xiě)這個(gè)次語(yǔ)言的標(biāo)準(zhǔn)做法是什么我是不是把另一個(gè)次語(yǔ)言的規(guī)則帶過(guò)來(lái)了能不能換一種寫(xiě)法這四個(gè)問(wèn)題我在 Code Review 時(shí)也經(jīng)常用來(lái)反問(wèn)別人比直接改代碼有效得多。2. 從預(yù)處理時(shí)代到編譯器時(shí)代const、enum、inline 如何替換 #define2.1 #define 的三個(gè)典型隱患條款 02 是“盡量以 const、enum、inline 替換 #define”這一條表面上是說(shuō)風(fēng)格實(shí)際上是講“不要依賴(lài)預(yù)處理器做語(yǔ)言本身該做的事”。我剛?cè)胄袝r(shí)特別喜歡用宏定義常量用 #define寫(xiě)小工具函數(shù)用 #define覺(jué)得簡(jiǎn)單粗暴。后來(lái)在項(xiàng)目里吃過(guò)虧才明白宏的三大隱患。第一宏不進(jìn)入符號(hào)表出了編譯錯(cuò)誤你看到的只有數(shù)字。比如你寫(xiě)了 #define N 42編譯器報(bào)錯(cuò)信息里只顯示 42不會(huì)提示你 N 是什么排查起來(lái)全靠記憶。第二宏沒(méi)有類(lèi)型檢查。你在一個(gè)需要 double 的地方使用了 int 宏常量編譯器不會(huì)給出任何警告一旦協(xié)議格式變化或者數(shù)據(jù)類(lèi)型升級(jí)問(wèn)題就埋在深處。第三宏在預(yù)處理階段替換展開(kāi)后的副作用很難預(yù)測(cè)尤其是帶參數(shù)的宏比如 #define SQUARE(x) x * x調(diào)用 SQUARE(1 2) 會(huì)展開(kāi)成 1 2 * 1 2結(jié)果出乎所有人意料。2.2 常量替換的具體做法和場(chǎng)景選擇原書(shū)給出的替代方案很明確對(duì)于常量?jī)?yōu)先用 const 常量替代 #define如果要在 class 內(nèi)定義一個(gè)常量且希望它是編譯期整數(shù)常量可以用 enum 來(lái)實(shí)現(xiàn)“類(lèi)似宏”的效果對(duì)于函數(shù)宏用 inline 函數(shù)替代。先看最常用的 const 場(chǎng)景。假設(shè)你需要定義一個(gè)全局常量// 原來(lái)的寫(xiě)法 #define MAX_CONNECTIONS 1024 // 替換后的寫(xiě)法 const int MaxConnections 1024;這里有個(gè)容易忽略的細(xì)節(jié)當(dāng)你用 const 定義全局常量時(shí)這個(gè)常量默認(rèn)具有內(nèi)部鏈接internal linkage也就是每個(gè)編譯單元都有一份獨(dú)立的副本。如果你想讓它在多個(gè)編譯單元之間共享需要加上 extern// 頭文件 extern const int MaxConnections; // 某個(gè) .cpp 文件 const int MaxConnections 1024;這一點(diǎn)在大型項(xiàng)目里特別重要。我見(jiàn)過(guò)好幾個(gè)項(xiàng)目頭文件里直接寫(xiě) const std::string kAppName xxx;結(jié)果每個(gè)包含這個(gè)頭文件的編譯單元都實(shí)例化了一份 std::string白白增加了二進(jìn)制體積。用 extern 聲明、在 cpp 中定義是更好的做法。再看 class 內(nèi)的常量。如果常量只在類(lèi)內(nèi)使用而且你想讓它在類(lèi)內(nèi)“可見(jiàn)”C11 之前有一種常見(jiàn)寫(xiě)法class GamePlayer { private: static const int NumTurns 5; // 常量聲明 int scores[NumTurns]; // 用它來(lái)聲明數(shù)組 };這種寫(xiě)法依賴(lài)“類(lèi)內(nèi)初始化器”和“編譯期常量”的結(jié)合。C11 之后static constexpr 更推薦比如 static constexpr int NumTurns 5;語(yǔ)義更明確。但這里有一個(gè)“歷史遺留坑”如果你只是聲明了 static const int NumTurns 而沒(méi)有在類(lèi)外定義取它的地址例如 int* p NumTurns;時(shí)某些編譯器會(huì)報(bào)鏈接錯(cuò)誤因?yàn)槿鄙俣x。解決方法是類(lèi)外補(bǔ)一行 const int GamePlayer::NumTurns;而 enum 不存在這個(gè)問(wèn)題——enum 沒(méi)有地址的概念。這就是條款 02 提到的 enum hack當(dāng)你想在類(lèi)內(nèi)聲明一個(gè)編譯期整數(shù)常量又不想讓它變成可被取地址的對(duì)象時(shí)enum 是一個(gè)非常合適的工具class GamePlayer { private: enum { NumTurns 5 }; int scores[NumTurns]; };enum 的意義在于它既是編譯期常量又有類(lèi)型約束而且不能被取地址也沒(méi)有鏈接問(wèn)題。在工作中如果你寫(xiě)的是老代碼風(fēng)格的項(xiàng)目enum hack 依然能解決實(shí)際問(wèn)題如果你用的是 C17 及以后的標(biāo)準(zhǔn)static constexpr 通常更優(yōu)雅但理解 enum hack 背后的動(dòng)機(jī)依然重要因?yàn)樗谀0逶幊汤餆o(wú)處不在。2.3 函數(shù)宏的 inline 替換帶參數(shù)的宏是一門(mén)“危險(xiǎn)的藝術(shù)”典型的 #define CALL_WITH_MAX(a, b) ((a) (b) ? (a) : (b)) 即使加了括號(hào)也可能因?yàn)閷?shí)參自增表達(dá)式被多次求值而產(chǎn)生問(wèn)題。我實(shí)際踩過(guò)一次傳了一個(gè) map.find() 的返回值宏內(nèi)部把它比較了兩次、取用了三次迭代器狀態(tài)直接亂掉。inline 函數(shù)可以完美解決這個(gè)問(wèn)題。把宏改成普通函數(shù)加 inline 關(guān)鍵字不僅類(lèi)型安全參數(shù)只求值一次而且行為可預(yù)測(cè)templatetypename T inline T callWithMax(const T a, const T b) { return a b ? a : b; }注意這個(gè)模板版本接受任意類(lèi)型而且使用 const 引用避免了不必要的拷貝。這一點(diǎn)是宏無(wú)法做到的宏沒(méi)有類(lèi)型概念不會(huì)幫你做拷貝優(yōu)化也不理解引用語(yǔ)義。在熱路徑上inline 函數(shù)有機(jī)會(huì)被內(nèi)聯(lián)展開(kāi)性能上與宏接近但可調(diào)試性和可讀性完勝。我自己的心得是不要試圖“完全消滅宏”而是要弄懂宏能做什么、不能做什么。配置文件里的版本號(hào)、條件編譯開(kāi)關(guān)、以及那些必須依賴(lài)預(yù)處理指令才能實(shí)現(xiàn)的功能宏依然是唯一選擇但凡是“語(yǔ)言層面能表達(dá)的東西”優(yōu)先用語(yǔ)言特性。這條邏輯直到今天依然成立。3. const 的多重身份指針、容器、函數(shù)返回值與成員函數(shù)3.1 指針和迭代器上的 const位置決定含義條款 03 的主題是“盡可能使用 const”。這一條看起來(lái)簡(jiǎn)單實(shí)際是 C 里最容易出 bug 的語(yǔ)法點(diǎn)之一尤其是 const 加在指針的哪個(gè)位置含義完全不同。char greeting[] hello; char* p greeting; // 非 const 指針?lè)?const 數(shù)據(jù) const char* p2 greeting; // 非 const 指針const 數(shù)據(jù) char* const p3 greeting; // const 指針?lè)?const 數(shù)據(jù) const char* const p4 greeting; // const 指針const 數(shù)據(jù)判斷方法很簡(jiǎn)單看 const 修飾的是誰(shuí)。const 在星號(hào)左邊修飾的是“被指向的數(shù)據(jù)”const 在星號(hào)右邊修飾的是“指針本身”。這里的“數(shù)據(jù)”到底是字符串還是對(duì)象在數(shù)組和指針場(chǎng)景中表現(xiàn)得特別明顯。我經(jīng)常在 Code Review 里看到有人把只讀的字符串參數(shù)寫(xiě)成 char*結(jié)果旁邊還掛著一堆 const 警告。改成 const char* 或 const std::string函數(shù)體里再也不會(huì)有人試圖修改傳入內(nèi)容。STL 迭代器也有同樣的規(guī)則。const_iterator 相當(dāng)于 const 數(shù)據(jù)的指針?biāo)赶虻娜萜髟夭荒芡ㄟ^(guò)該迭代器修改但迭代器本身可以移動(dòng)而 const 迭代器iterator 對(duì)象本身是 const不能移動(dòng)但指向的元素可以改。前者是“只讀視角”后者是“固定位置”。std::vectorint vec {1, 2, 3}; const std::vectorint::iterator it vec.begin(); // 迭代器本身不能移動(dòng) std::vectorint::const_iterator cit vec.begin(); // 指向的元素不能改 *it 10; // 可以元素非 const it; // 編譯錯(cuò)誤迭代器本身是 const cit; // 可以迭代器可移動(dòng) *cit 10; // 編譯錯(cuò)誤元素被 const 限制我第一次把這四種情況列在一起時(shí)才徹底弄清了 why。核心在于STL 迭代器用法上像指針語(yǔ)義上也分“指向的東西”和“自身”。把 const 用對(duì)位置能直接消除一整類(lèi)編譯期問(wèn)題。3.2 函數(shù)返回值加 const防止語(yǔ)義被誤用const 不僅可以用在參數(shù)和變量上還可以修飾函數(shù)返回值。原書(shū)舉的例子是重載運(yùn)算符。像 operator* 返回 const Rational能防止用戶(hù)寫(xiě)出 (a * b) c 這種荒謬的代碼。這個(gè)例子放在今天某些人眼里會(huì)覺(jué)得小題大做但它背后的問(wèn)題在自定義類(lèi)型里非常常見(jiàn)。我自己遇到過(guò)類(lèi)似的場(chǎng)景某個(gè)類(lèi)實(shí)現(xiàn)了 .value() 方法返回內(nèi)部值的引用調(diào)用方不小心把返回值賦給了一個(gè)可變引用然后修改了內(nèi)部狀態(tài)整個(gè)對(duì)象的封裝性被擊穿。如果返回值加了 const 限定編譯器會(huì)在第一時(shí)間報(bào)錯(cuò)。所以我的習(xí)慣是默認(rèn)情況下返回內(nèi)部狀態(tài)的 getter 要么返回值要么返回 const 引用只有當(dāng)調(diào)用方確實(shí)需要修改內(nèi)部對(duì)象時(shí)才提供非 const 版本。這個(gè)習(xí)慣能擋住很多無(wú)意識(shí)的破壞。另一個(gè)容易忽略的角度是const 返回值還能讓臨時(shí)對(duì)象讀起來(lái)更安全。比如 operator 返回 const 對(duì)象時(shí)臨時(shí)對(duì)象的生命周期不會(huì)變長(zhǎng)但它阻止了對(duì)臨時(shí)對(duì)象的修改。雖然 C11 移動(dòng)語(yǔ)義讓某些“返回 const 對(duì)象會(huì)阻礙移動(dòng)”的問(wèn)題浮現(xiàn)出來(lái)但具體問(wèn)題還要具體看如果返回值是自己封裝的小對(duì)象且沒(méi)有移動(dòng)需求const 返回值依然是合理選擇。3.3 const 成員函數(shù)接口的“讀寫(xiě)權(quán)限聲明”條款 03 后半段討論了 const 成員函數(shù)這是很多初學(xué)者最陌生、但實(shí)際項(xiàng)目中最常見(jiàn)的設(shè)計(jì)手段。給成員函數(shù)加上 const等于告訴調(diào)用方“這個(gè)函數(shù)不會(huì)修改對(duì)象的邏輯狀態(tài)”。好處有兩點(diǎn)一是從接口層面直接區(qū)分“讀”和“寫(xiě)”使用者一看便知二是 const 對(duì)象只能調(diào)用 const 成員函數(shù)這決定了你的類(lèi)能否被 const 引用安全地使用。C 對(duì) const 成員函數(shù)的默認(rèn)要求是“bitwise constness”也就是成員變量一個(gè)字節(jié)都不能變。但實(shí)際需求往往是“l(fā)ogical constness”邏輯上不該變但某些內(nèi)部緩存字段可以變。這時(shí)候需要 mutable 成員變量。class TextBlock { public: size_t length() const { if (!lengthValid) { cachedLength computeLength(); // 緩存長(zhǎng)度 lengthValid true; } return cachedLength; } private: std::string text; mutable size_t cachedLength 0; mutable bool lengthValid false; };這個(gè)例子我拿它解釋 mutable 時(shí)幾乎所有人都能秒懂查詢(xún)長(zhǎng)度是個(gè)只讀操作但為了提升后續(xù)查詢(xún)速度需要第一次調(diào)用時(shí)偷偷緩存結(jié)果。如果沒(méi)有 mutableconst 成員函數(shù)里就寫(xiě)不了這種代碼。注意mutable 只能修飾成員變量不能修飾局部變量它是對(duì) const 成員函數(shù)“內(nèi)部可變性”的一種精確放行。還有一個(gè)經(jīng)常被寫(xiě)錯(cuò)的地方const 版本和非 const 版本的成員函數(shù)可以重載但實(shí)現(xiàn)時(shí)要注意避免代碼重復(fù)。原書(shū)給的技巧是“非 const 版本調(diào)用 const 版本”利用 const_cast 去掉返回值的 const 限制。我在實(shí)際項(xiàng)目中一般會(huì)反過(guò)來(lái)思考先把邏輯都放進(jìn) const 版本里非 const 版本只做轉(zhuǎn)發(fā)這樣最安全因?yàn)?const 版本對(duì)所有對(duì)象都可用。但我要提醒一句const 成員函數(shù)是“承諾”不是“強(qiáng)制”。如果你在 const 成員函數(shù)里調(diào)用了一個(gè)非 const 成員函數(shù)編譯器會(huì)拒絕但如果你用 const_cast 強(qiáng)轉(zhuǎn)那等于自己撕毀了承諾一旦對(duì)象本來(lái)是真正的 const 對(duì)象修改它就是未定義行為。所以 const_cast 只能用在“你知道對(duì)象本身不是 const”的場(chǎng)景里比如先查緩存、再返回可變引用這種經(jīng)典寫(xiě)法而不是用來(lái)繞過(guò) const 檢查。4. 初始化不是賦值對(duì)象使用前的“四大坑”與解決套路4.1 為什么 C 的初始化規(guī)則總把人繞暈條款 04 是“確定對(duì)象被使用前已被初始化”這大概是第一章里實(shí)際踩坑最多的一條。C 的初始化問(wèn)題非常擰巴有的變量不初始化就是垃圾值有的類(lèi)成員的默認(rèn)構(gòu)造會(huì)自動(dòng)初始化有的類(lèi)型比如內(nèi)置類(lèi)型在你聲明時(shí)不給你任何默認(rèn)值。我剛工作那年就吃過(guò)虧一個(gè)局部 bool 變量沒(méi)初始化剛好是 true程序走錯(cuò)了分支排查了一下午。這里要分清兩個(gè)概念初始化和賦值。初始化是“對(duì)象一生下來(lái)就有值”賦值是“先有對(duì)象再把值放進(jìn)去”。對(duì)于內(nèi)置類(lèi)型這兩者在形式上看起來(lái)一樣但對(duì)于類(lèi)類(lèi)型初始化調(diào)用的是構(gòu)造函數(shù)賦值調(diào)用的是 operator語(yǔ)義完全不同。用成員初始化列表就是初始化在構(gòu)造函數(shù)體內(nèi)賦值則是“先默認(rèn)構(gòu)造再賦值”后者多了一次無(wú)意義的默認(rèn)構(gòu)造開(kāi)銷(xiāo)有時(shí)還會(huì)導(dǎo)致不可預(yù)期的行為比如引用成員根本不能賦值。我對(duì)這條規(guī)則的執(zhí)行標(biāo)準(zhǔn)很簡(jiǎn)單所有內(nèi)置類(lèi)型成員、指針成員一律在聲明處初始化或構(gòu)造函數(shù)初始化列表中顯式初始化所有類(lèi)類(lèi)型成員能用初始化列表就用初始化列表。哪怕你覺(jué)得“反正默認(rèn)構(gòu)造也是空的賦不賦值都一樣”也要把初始化列表寫(xiě)出來(lái)因?yàn)榇a的可維護(hù)性來(lái)自“一眼能看出這個(gè)成員的值從哪里來(lái)”而不是靠推理。4.2 初始化列表與成員聲明順序的“隱形炸彈”用初始化列表時(shí)有一個(gè)特別隱蔽的規(guī)則成員的初始化順序只由它們?cè)陬?lèi)中的聲明順序決定與初始化列表的書(shū)寫(xiě)順序無(wú)關(guān)。也就是說(shuō)即使你在初始化列表里把 y 寫(xiě)在 x 前面如果類(lèi)中先聲明 x實(shí)際仍然是先初始化 x再初始化 y。這個(gè)坑在“用別的成員初始化當(dāng)前成員”時(shí)特別致命。例如class Point { public: Point() : y(2), x(y) {} // 看起來(lái) y 先初始化其實(shí)還是 x 先初始化 private: int x; int y; };實(shí)際運(yùn)行時(shí)x 先初始化而 x 的初始化用的是 y 的當(dāng)前值——此時(shí) y 還沒(méi)初始化是個(gè)垃圾值。于是 x 得到一個(gè)隨機(jī)數(shù)而不是預(yù)想的 2。這個(gè) bug 編譯器通常不會(huì)警告只有開(kāi)了 -Wreorder 之類(lèi)的選項(xiàng)或者運(yùn)行時(shí)輸出異常才會(huì)發(fā)現(xiàn)。我的建議是把初始化列表的書(shū)寫(xiě)順序永遠(yuǎn)和成員聲明順序保持一致并且盡量避免在成員初始化時(shí)依賴(lài)其他成員的值。依賴(lài)關(guān)系如果真的存在優(yōu)先在構(gòu)造函數(shù)體內(nèi)處理或者干脆用一個(gè)靜態(tài)函數(shù)統(tǒng)一計(jì)算。這條經(jīng)驗(yàn)看著簡(jiǎn)單但能救你很多次。4.3 跨編譯單元的 static 對(duì)象初始化次序問(wèn)題經(jīng)典中的經(jīng)典條款 04 最后討論了一個(gè)更宏觀的問(wèn)題不同編譯單元里定義的 static 對(duì)象的初始化次序是不確定的。這里的 static 對(duì)象包括全局對(duì)象、namespace 作用域的對(duì)象、類(lèi)里的 static 對(duì)象、函數(shù)里的 static 對(duì)象以及文件作用域的 static 對(duì)象。當(dāng)一個(gè) static 對(duì)象的初始化依賴(lài)另一個(gè)編譯單元中的 static 對(duì)象時(shí)你無(wú)法保證前者初始化時(shí)后者已經(jīng)初始化完畢。假設(shè) A.cpp 里有一個(gè)全局配置對(duì)象 ConfigManagerB.cpp 里有一個(gè)注冊(cè)表 RegistryRegistry 的構(gòu)造函數(shù)里要用 ConfigManager 去讀取配置。兩個(gè)文件誰(shuí)先初始化、誰(shuí)后初始化完全由鏈接順序和編譯器實(shí)現(xiàn)決定沒(méi)有任何標(biāo)準(zhǔn)保證。運(yùn)行起來(lái)可能這次正常、下次崩換個(gè)編譯器直接掛在啟動(dòng)階段。原書(shū)給出的解法我一直在用把“非局部 static 對(duì)象”替換成“函數(shù)內(nèi)的局部 static 對(duì)象”也就是用“構(gòu)造時(shí)初始化”的函數(shù)返回引用ConfigManager getConfigManager() { static ConfigManager instance; return instance; }這種做法被稱(chēng)為 “Meyers’ Singleton” 模式雖然這里不強(qiáng)調(diào)單例但這個(gè)技術(shù)在單例場(chǎng)景最常用。C11 之后函數(shù)內(nèi) static 對(duì)象的初始化是線(xiàn)程安全的編譯器會(huì)生成相應(yīng)的保證一次性初始化的代碼所以這個(gè)方案還順便解決了多線(xiàn)程環(huán)境下的初始化競(jìng)爭(zhēng)問(wèn)題。我在一個(gè)后臺(tái)服務(wù)里用這個(gè)方式管理配置、日志、連接池等組件啟動(dòng)順序問(wèn)題從根上消失了。這個(gè)技巧也有需要注意的地方如果兩個(gè)函數(shù)的初始化存在循環(huán)依賴(lài)A 初始化時(shí)需要 BB 初始化時(shí)需要 A這個(gè)方案同樣救不了你只能靠重構(gòu)拆解依賴(lài)。另外在 C11 之前的老編譯器上函數(shù)內(nèi) static 初始化的線(xiàn)程安全問(wèn)題需要自己加鎖不過(guò)現(xiàn)在新項(xiàng)目基本默認(rèn) C17 或更高標(biāo)準(zhǔn)這個(gè)顧慮已經(jīng)很小了。5. 這些規(guī)則在今天還能怎么用我的幾條實(shí)戰(zhàn)經(jīng)驗(yàn)5.1 用“四個(gè)次語(yǔ)言”做 Code Review 的前置分類(lèi)讀完條款 01 后我形成了一套自己的 Code Review 流程先看這段代碼屬于哪個(gè)次語(yǔ)言再用對(duì)應(yīng)次語(yǔ)言的標(biāo)準(zhǔn)去評(píng)價(jià)。比如一個(gè)用 STL 算法實(shí)現(xiàn)的過(guò)濾邏輯我會(huì)關(guān)注迭代器用法、算法復(fù)雜度、是否能用 lambda 簡(jiǎn)化一個(gè)用面向?qū)ο箫L(fēng)格設(shè)計(jì)的類(lèi)我會(huì)關(guān)注接口設(shè)計(jì)、const 正確性、是否違反開(kāi)閉原則一個(gè)模板工具函數(shù)我會(huì)關(guān)注類(lèi)型推導(dǎo)、引用折疊、是否需要 SFINAE 或概念約束。這種分類(lèi)思維能讓你在面對(duì)“這代碼寫(xiě)得好不好”時(shí)給出一個(gè)更精準(zhǔn)的答案而不是籠統(tǒng)地說(shuō)“感覺(jué)不太優(yōu)雅”。C 的“好”永遠(yuǎn)是相對(duì)的同一段代碼放在 C 風(fēng)格模塊里可能不倫不類(lèi)放在模板庫(kù)的擴(kuò)展里可能恰到好處。5.2 const 正確性是“傳染性”的早加比晚加便宜得多const 正確性有一個(gè)特點(diǎn)它像一種會(huì)“傳染”的屬性。一個(gè)沒(méi)有 const 的函數(shù)調(diào)用另一個(gè)函數(shù)時(shí)如果后者是 const 成員函數(shù)前者可以安全調(diào)用但如果一個(gè) const 對(duì)象調(diào)用了非 const 成員函數(shù)編譯器直接報(bào)錯(cuò)。所以 const 加得越早后面其他代碼就越容易保持 const 安全等代碼寫(xiě)完了再補(bǔ) const往往是一串連鎖修改。我建議新寫(xiě)的接口所有參數(shù)能加 const 引用的都加所有不修改內(nèi)部狀態(tài)的成員函數(shù)都標(biāo) const。你可以不加 const 也能編譯通過(guò)但加了 const 之后編譯器會(huì)強(qiáng)制你維護(hù)這個(gè)承諾長(zhǎng)期看能擋掉很多無(wú)意的修改。這里的額外價(jià)值是當(dāng)別的函數(shù)需要一個(gè) const 對(duì)象時(shí)你的類(lèi)已經(jīng)準(zhǔn)備好了。5.3 初始化順序問(wèn)題編譯器不是你的朋友而是你的敵人我最后想強(qiáng)調(diào)的還是初始化。每次看到有人自信地說(shuō)“對(duì)象反正會(huì)默認(rèn)初始化”我就想起純 C 時(shí)代的局部變量它不會(huì)默認(rèn)初始化。C 在類(lèi)類(lèi)型上引入了默認(rèn)構(gòu)造的概念但它依然不會(huì)幫你初始化內(nèi)置類(lèi)型成員。很多人以為的“默認(rèn)初始化”實(shí)際上是“默認(rèn)不初始化”直到程序在某個(gè)隨機(jī)時(shí)間點(diǎn)爆出奇怪的值才意識(shí)到。我的建議是給自己定一條鐵律所有需要初始化的對(duì)象要么在聲明處初始化要么在構(gòu)造函數(shù)的初始化列表中明確寫(xiě)出。不依賴(lài)“默認(rèn)值”不依賴(lài)“某個(gè)函數(shù)會(huì)幫我填”不依賴(lài)“運(yùn)氣”。這個(gè)習(xí)慣比任何靜態(tài)檢查工具都有效因?yàn)樗鼜脑搭^消除了未定義狀態(tài)。6. 讀這一章時(shí)我踩過(guò)的幾個(gè)坑最后聊點(diǎn)個(gè)人體會(huì)。我第一次讀條款 02 時(shí)覺(jué)得自己早就知道 const、enum、inline 的用法沒(méi)必要逐條看。結(jié)果沒(méi)過(guò)多久就在實(shí)際項(xiàng)目中犯了一個(gè)教科書(shū)級(jí)的錯(cuò)誤我在頭文件里寫(xiě)了 #define PI 3.1415926另一個(gè)模塊剛好也定義了一個(gè)同名宏預(yù)處理階段兩個(gè)宏互相污染編譯錯(cuò)誤信息里全是裸的數(shù)字。那一刻我想起條款 02 的副標(biāo)題才明白“讓自己習(xí)慣C”不是讓你知道這些技巧而是讓這些技巧成為你的默認(rèn)選項(xiàng)。另一個(gè)讓我印象深刻的坑是 static 初始化順序。當(dāng)年做一個(gè)中間件插件兩個(gè)插件各自維護(hù)一個(gè)靜態(tài)注冊(cè)表一個(gè)的注冊(cè)入口依賴(lài)另一個(gè)的版本號(hào)。開(kāi)發(fā)環(huán)境一切正常發(fā)布到線(xiàn)上偶發(fā)崩潰。后來(lái)查了幾天發(fā)現(xiàn)問(wèn)題就是跨編譯單元的 static 初始化順序不確定。用局部 static 函數(shù)替換全局對(duì)象后問(wèn)題徹底消失。這個(gè)經(jīng)歷讓我對(duì)“非局部 static 對(duì)象”產(chǎn)生了心理陰影——現(xiàn)在凡是看到全局配置、全局單例、全局注冊(cè)表我都會(huì)下意識(shí)去想它們的初始化依賴(lài)關(guān)系。還有一點(diǎn)const 成員函數(shù)里的 mutable 用得多了會(huì)讓類(lèi)的線(xiàn)程安全性變差。比如上面那個(gè)緩存長(zhǎng)度的例子如果兩個(gè)線(xiàn)程同時(shí)調(diào)用 length()mutable 的緩存字段可能被并發(fā)寫(xiě)。實(shí)際工程里要么用 std::call_once 或 std::mutex 保護(hù)緩存邏輯要么干脆在文檔里注明這個(gè)類(lèi)不是線(xiàn)程安全的。我后來(lái)給自己定了一個(gè)原則mutable 只能用于“線(xiàn)程邊界明確”的場(chǎng)景否則寧可放棄緩存也不引入數(shù)據(jù)競(jìng)爭(zhēng)。如果你正要開(kāi)始讀 Effective C 或者已經(jīng)讀到后面幾章我建議你時(shí)不時(shí)回到第一章看一眼。這不是溫故知新而是這一章講的是“思維方式”而不是“語(yǔ)法糖”。等你真正把“語(yǔ)言聯(lián)邦”“用編譯器替預(yù)處理器”“盡可能 const”“先初始化再使用”這四條刻進(jìn)寫(xiě)代碼的本能里后面 51 個(gè)條款讀起來(lái)會(huì)順很多。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
激情欧美97| 天天色天天干天天爱| 国产亚热在线久久| 强乱老妇中文字幕| 中出789在线视频| 91亚州欧美| 一区二区三区在线日韩影院观看| 色九九九九九九| 无人区高清电影免费观看一区二区三 www.qmcai2.com | 色色福利| 欧美亚洲第1页| 国产精品。| 一区二区影视| 狠狠操狠狠爱| 97日韩欧美亚洲| 美中日韩无码| 日夜久久久九九九久| av天堂加勒比| 久久婷色| 91视频综合在线| 美女操逼A A| 亚殴在线| 亚洲高清色综合| 久久久555| 久久久亚洲熟妇熟女| 亚洲国产成人精品999| 少妇一级婬片免费放一级a性色. | 国产 日韩 欧美 人妻 熟女 中文 69人妻精品一区二区绯色 | 婷婷综合久久| 97视频在线播放| 99综合网| 久久久亚洲熟妇熟女| 国产亚洲日韩在线三区黑人| 美性中文综合网| 免费a v| 欧美久久伊人| 大香蕉黄色一级片免费看| 国产精品毛片| 无码精品啪啪啪一区二区三区三州| 区二区亚洲婷| 操人人| 99操碰| 中文字幕色AV| 色播丁香| 97精品一区二区视频在线观看| 百度百度日本操逼| AV老汉| 日本不卡高清视频| 97日韩欧美亚洲| www久久久| 东京热,男人的天堂| 国产欧美日本亚洲精品| 大香蕉啪啪啪| 亚洲女人毛茸茸91| 欧美日产国产在线成人第一区| 伊人久久久日韩一区| 91丨熟女丨丰满熟女| 在线观看A啊啊啊| 美国精品国产精品| 国产精品69久久久久久久| 国模精品娜娜一二三区| 97视频www| 成人性爱av.com| 亚洲瓯美色图| 国产91影院| 少妇三P| 97久久国产精品| 天天欧美| 国产色产精品在线观看| 大香蕉一人| 久久精品亚洲婷婷| 欧美 色 亚洲| 超碰 国产熟女精品一区| 色制服丝袜夫妻av一区| 九九热五区| 操逼逼福利视频| 黑丝91视频| 亚洲av综合色区图片亚洲| 老熟女阿 国产91| 欧美一级欧美三级在线观看| 黄页av| 99热亚洲天堂| 亚洲人成在线放东京热| 中文字幕啊啊啊在线观看视频| 中出20p| 国产精品久久久蜜臀| 囯产精品久久久久久久久久梁医生| 国产黄a三级三级三级av在线看| 69XX一中文字幕人妻91| 91丝袜视频在线观看| 激情五月丁香五月| 亚洲精品99999| 欧美五区| japan日本高清乱xxxx| 丁香五月天久久精品视频一区二区三区| 岛国在线一区二区三区| 性一级黄色录像片网站导航| 精品少妇后入一区二区三区四区人妻巨乳| 欧美日韩日产免费网站看| 亚洲熟妇无码一区二区三区| 婷婷伊人| 欧美劲爆视频一区二区| 国内毛片热久久思思热| 国产精品久久久久久久久久久久| 欧美日韩婷婷中文| 97超碰国产精品| av日韩手机在线影视| 中文字幕青青草| 嫩草 人人网精品| 家庭乱伦性爱av| 久久精品国产亚洲AV清纯| 夜夜高潮夜夜爽国产伦精品| 欧美日韩高潮喷水91| a片自拍直播视频| 久热一区二区| 97在线播放 | 亚洲字幕一区二区| 日日躁天天躁狠狠躁| 香蕉在线一区二区三区| 日本岛国黄色网址| 5278欧美一区二区三区| 少妇3P性爱自拍| 女人天堂网| 人妻激情另类| 白天啪啪晚上啪啪视频| 一级二级三级黑人无码| 少妇高潮一区二区三区在线| 中文字幕在线观看AV| 五月天综合在线| 日日操免费视频| 上特色A在线| 少妇第一页| 99色婷婷中文字幕乱色| 中文字幕 一区二区 亚洲无码| 怡红院一区二区熟女人妻| 91成人无码| 玖玖综合网| 亚洲男人在线观看天堂| 亚拍在线| 伦理日韩国产久久| 日欧美色| 久操视频免费观看| 亚洲麻豆18发?| 男人的天堂网免费| 美女黄色一级A视频| 岛国福利在线精品播放| 午夜激情成人在线观看| 日韩高清黄片| 日本综合色图| 人妻丰满熟妇av无码区蜜桃| 蜜臀网址在线| 蜜桃久久一区二区| 欧美中文字幕男人天堂久久精品| 天堂中文资源在线bt| 老熟女综合网| 人人澡人人干| 精品免费成人久久| 老熟女网站| 乱色老一区二区三区的观看方式| 手机在线视频国内精品| 欧美 亚洲 第一页| 一区二区亚州激情久婷婷欧美| 亚洲一区二区性爱电影| 久久6热精品99视频| x97av| 中文操逼字幕| 欧美色91| 久夜操| 日本幼女18+| 97精品国产97久久久久久| 熟妇的味道HD中文字幕| 97人人夜夜精品视频| 女生看匆91网站| 亚洲色诱惑| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 97超碰美国| 国产丝袜视频| 超91综合网| av在线播放国产一区| 久久久夜夜夜| 嗯嗯嗯啊啊在线观看| 青草视频人妻在线观看| 激情五月天校园春色网| 亚洲骚逼少妇| 17c在线成人免费A片观看| 91丨人妻丨国产丨丝袜| 国产精品97视频| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 99久久婷婷| 五月丁香| 国产92麻豆天美精品色欲5| 99热这里都是精品| 97操综合| 国产9 9在线 | 亚洲| 另类 日韩 熟女| 亚州精人品大香蕉| 亚洲成人AB| 国产精品禁久久久精品| 日本成熟少妇A∨网站| 国产精品美女视频诱惑| 亚洲九月丁香| 三级片大波波| 麻豆一区二区三区精品| 久久爱超碰网| 欧美精品宗合| 1人人看人人摸人人操| 国产大学生高潮在线播放 | 亚洲色图大香| 少妇内射视频| 天天视频网站黄| 天天操人人操狠狠插| 发朗少妇买婬全视频中文| 翔田千里爆乳巨臀无码| 老外又粗又长一晚做五次| 蜜臀99久久国产| 十八禁视频一区二区| 欧美日本一区二区a人| 国产一区二区欧美日本| 超碰精品| 久久人妻无码毛片A片麻豆| 一区二区三区网站日日骚| 91 丝袜在线| 国产亚洲日本| 91影库| 久久久一区二区三区四区五区| 久久久久78| 国产第11页| 99999精品成人| 天天综合-91入口| 精品毛片久久久精品毛片| 伊人大香蕉在线| 天天操美美| 4141514逼喷水三级片| 99热精品国产| 91一区二区三区蜜桃| 婷婷综合网| 97精品国产97久久久久久户外免费| 午夜操操操| a'v在线资源| 国产精品久久久久无码A√| 免费在线观看国内色片网站网址| 亚洲 欧美都市激情| 69精品在线| 欧洲精品一区二区三区| 91欧美情色| 色官网在线| yirendaxiangjiashipin| 国偷自 一区二区| 外国91| 亚洲色色探花| 久久久精品国产亚洲AV无码| 男人的天堂2018东京热啪啪啪| 黑白配性爱AV成| 蜜臀AV秘一区翔田千里| 九九综合久久| 国产精品一区二区三区四区五区| 制度丝袜99| 老熟女乱子伦中文字幕一区二区| 欧美色图人妻| a级理论午夜日本| 欧美婷婷| 国产精品久久久久久9999| 免费超碰97久久| 婷婷五月天久久久| 天堂亚洲精品| 五月婷视频| 欧美日韩一干二干| 国内一区二区免费| 欧美一级黄片免费播放| 日韩99神马视频播放| 中文字幕高清精品一区| 久久超碰大香蕉| 男人天堂2017| 欧美精品第四五页中文字幕在线观看| 操操吧亚洲乱伦视频| 美女诱惑爱爱| www.yeyecao| 超碰97首页| 探花精品 一区二区| 18一区二区三区| 亚洲天堂五月天国产| 91nbbbbbb| 激情五月综合开心五月| 物尤视频一区二区| 亚洲精品啪视频| 98超碰日本| 日本三级大片| 无码人妻精品一区二区三区99不卡| 日日夜夜干| 国产suv一区二区三区6| 国产毛片精品一区二区色欲黄A片| 无码人妻精品酒店| 97色色视频| 国产精品亚洲四五区在线观看| 以及麻豆国产入口在线观看免费| 欧美在线视频观看一二三四区高清| 欧美色图 人妻| 91扒丝袜综合在线| 精品成人av一区二区三区在线| 97免费视频在线观看| 91丝袜熟女| 另类图片欧美激情综合| 欧美专区17页| 久久综合日韩亚洲欧美| 国模无码人体一区二区三| 欧美男女午夜啪啪| 国产网站在线播放| 欧美精品三级黄片| 9美女超碰在线免费观看| 强免费黄色网址| 亚洲欧美校园| 亚洲无码?第一页| 手机在线大香蕉| 国产精品亚洲美女久久久久| 日本乱人伦片中文三区| 啊啊啊啊啊啊在线| 久久久久国产精品人妻aⅴ天堂| 性在久久久久久| 亚洲一二三四区机械| 91日产桃蜜| 五月婷在线| 18禁看网站一区| 日韩欧美成人大香蕉| 欧美18老人禁| 欧美黄色大香蕉一区二区| 日本精品网站在线中文| 人人操人人射人人干| 偷拍 亚洲| 少妇激情一区二区三区视频| 亚洲日韩一区电影| 亚洲Av噜噜一区二区三区妖精| 人妻系列无码专区中文有码| 91色色综合| 日本视频在线中文字幕| 青青草字幕AV| 欧美性爱系列| 十八禁的黄污污免费网站| 人妻喷水| 色女99一级片在线观看| 国产精品久久99日日| 日本人妻丰满熟妇久久久久久| av天堂加勒比| 91蜜臀在线久久久久| 国产传媒午夜理伦精品| 少妇激情AV| 色老牛| 日本女人操逼| 91色拍| 青青草在线视频人人想人人上| 大香蕉五月天| 国产性爱在线视频一区二区| 亚洲一区二区中文字幕| 午夜欧美神马久久久久| 97伪v| 色九九九九| 久久大香蕉| 国产成人网| 强奸乱伦αv片| 精品无码一区二区三区色欲| 97日韩欧美亚洲| 日韩av情韩国爱禁区av一区二区| 二区熟妇韩日| 动漫片子网站3黄| 国产精品亚洲免费| 国产色呦呦| 欧美综合传媒| 秋霞鲁丝午夜无码一区二区三| 日本阿v天堂在线观看| 中文字幕成人理论在线| 国产美女自拍视频| ji熟女.com| 9999九九九久久久| 五月婷婷丁香六月丁香| 亚洲区限制级 99| 国产AV毛片| 国产91丝袜 在线播放| gogogo免费高清看中国国语| 伊人在线大香蕉视频久久| 日韩免费看黄片| 天堂性色| 天天天操天天天爱| 精品久久久久久中文| 啊啊啊啊好疼| 亚洲一本色码中文字幕| 91人精品妻入口| 精品一区二区三区蜜桃臀www| 深夜激情| 色偷偷2020免费视频播放| 五月丁香影视| ji熟女.com| 啊啊啊啊啊啊啊在线| 亚洲AV成人无码一二三久久| 国产丰满少妇久久久精品影院| 免费a v| 久久宗合亚洲| 综合色色婷婷| 亚洲影院成人| 久久久久久中文| 精精夜夜| 亚洲A曰本VA欧美VA视频| 色偷综合| 神马福利久草| 日本成人A片免费看| 久久9精品| 91美女色视频亚洲| 91久精品| 日本性爱视频一级| 国产精品夜夜夜| 天美传媒一二三区永久网站| 久久精品| 丰满欧美少妇| 国产二区视频在线观看电影| 亚洲日韩乱码中文无码蜜桃臀网站| 18禁中文字幕| 大香蕉一级黄色片久久| 中文子幕一二三| 啊啊啊com| 日日夜夜噜| 亚洲熟女综合| a片在线播放| 中文字幕国产精品1区| 天天欧美欧美亚洲网| 富二代亚洲精品99| 日韩亚洲精品一区二区| 亚洲国产97| 久久久草草精品| 九九热精品| 国内毛片婷婷六月色| 蜜臀少妇一区二区| 亚洲操逼无码| 高清无码在线播放网站| juliaann欧美丝袜办公室| 九一性生活免费视频| 日韩欧美亚洲一区二区三区影院| 欧美性高潮在线| 中文字幕一区二区三区蜜臀| 日婷婷| 国产熟女无套内射| 日韩视频小说在线观看 | 五月天婷婷久久| 久久久新亚洲AV| 久热久| 深爱五月天| 精品毛片av一区二区| 久久伊人最新网址视频| 丁香九月婷婷| 欧美精品黑人猛交高潮| 亚洲欧美91√| 极品色电影院| 操人91| 人人摸人人添人人操| 黑丝内射一区二区三区| 大屁股xxxxx| 天天日B夜夜干B时时操B| 狠狠综合| 久久久久久久久久久久97| 欧美日韩中国x| 99热超碰| 欧美日韩国产中文超碰| 精品丰满人妻一区二区三区免费观| 国语对白露脸XXXXXX| 精品无码产区一区二| 日本超碰97日韩精品人妻| 99自拍视频在线| 秋霞免费AV| 国产精品白丝AV| 国产毛片在线| 粉嫩av一区二区三区天美传媒| 欧美激情欧美精品| 夜夜爽33333| 熟女人妻一区二区三区| 久久精品国产亚洲妲己影视| 欧美成人免费在线观看| 一级AV性爱| 免费岛国一级片| 日本三级韩国三级美三级91| 亚洲少妇色图自慰直播| 精品四五区| 一区二区三区 丝袜 高跟 美腿 | 人妻天天夜夜爽一区二区| 欧美午夜一区二区三区| 欧美亚洲第一页| 精品亚洲国产成人精品| ?亚洲伊人伊成久久人综合网| 女同女同恋久久级三级| 人妻久久一区二区三区| 日韩亚洲97| 欧美亚洲成人在线一区二区三区| 成人在线视频二区| 女同性恋久久| 国产极品美女高潮无套在线观看| 无码聚合| 日本大片日本一区二区免费高清| 精品成人av一区二区三区在线| 97人人模人人爽人人| 夜夜爽77777| 天天日日本| 国产精品在线网站| 精品久久大胆人体| 国产一区二区三区久久久精品| 九九九九国产| 天天澡天天爽日日AV| 99久久精品无码一区二区毛片免费 | 国产精品剧情| 国产9l 大屁股| 欧美色图片色哟哟| 性无码专区2020| 日韩啊V| 岛国片国产成人亚洲播放| 色婷亚洲五月在线观看| 久久9 9 9精品| 玖玖97综合| 久久五月视频| 六月婷婷五月丁香| 日韩AC| 国产精品视频白浆免费| 99激情| 欧美亚洲日韩人妻在线观看| 天天爽天天操| laoshunv91| 欧美色日本| 综合色拍| 在线五区| 思思久热在线精品66| 美中日韩无码| 熟女突然公开看18禁影片 | 26uuu性| 亚洲一区二区性爱电影| 超碰这里有精品| 亚洲激情视频| 亚洲国产午夜真人一级片中文字幕精品黄网站 | 日本三级精品| 国产免a费看黄片在线| 99性爱| 99久久九九| 狠综合网| 国产精品丝袜在线| 欧美色女人| 国产一区二区成人av在线播放| 欧美一区二区三区另类精品| 3571色综合一区二区二区| 精品无人区麻豆乱码久久久| 97中文综合| 91综合网在线| 中国一级αV| 国产隔壁老王影院在线| 久久久久成人蜜桃精品| 激情婷婷丁香网| 在线观看无码三级少妇| 丰满翘臀美女影院视频| 97国产色图| 一区二区中文| 欧美一级国产一级| 麻豆久久久久久久久丝袜| 亚洲欧洲综合| 蜜桃久久一区二区| 亚洲啪啪性视频| 豆1无夜无码| 亚洲色电影在线| 综合久久欧美| 日韩不卡一二三四| 亚州一区二区成人片免费| 乱伦系列一区二区| 亚洲的天堂网| 制度丝袜99| 欧美性,色九九| 亚洲色婷婷久久91| 搡老熟女老女人老熟妇免费视频| 成人一区二区三区四区| 欧美性爱免费短视频| 性欧美体内射精| 久欲AV| 伊人久久大香线蕉无码| 国产五码丝袜屁眼| 98人妻精品一区二区色欲| 亚洲AV无码天美传媒一区| 欧美操逼录像国产黄色国产| 中文字幕人妻资源在线| 国产欧美日韩女同性恋ww喷水精品 | 九九九九AV| 人人摸.人人色| 欧美一二三区四五区| 91色图| 99热超碰| 天天看精品动漫视频一区| 丝袜美腿诱惑亚洲欧美视频在线观看| 大色网久久| 午夜福利1区2区3区| 久久精彩免费视频| 国产一区二区精品在线视频| 一级性爱网| 色综合天天| 午夜AV污污污| 国内毛片无遮挡国产| 九九热视频在线观看| 97在线视频免费看| 温婉少妇玩3p| 日本天天操| 亚洲猛交| 久久久久久久久久久久欧美日| 中国熟女91| 欧美v亚洲v综合v国产v妖精| 色婷婷六月| 久久久不卡| 999国产精品999| 一二三四区电影| 97人人操人人干| 久热大香蕉网站| 久久精品毛片免费不卡| 亚洲男人天堂2| 高清无码一区二区三区| 日本高清熟女久久一区| 高清在线不卡一区二区 视频| 人人么人人操| 国产白丝av| 神马久久久久眼| 性爱乱伦网址| 亚洲Av无码成人精品国产| 久久av一级av少妇av高潮| 另类小说五月天| 蜜臀99久久精品| 爱干爱射网啊啊啊| 青青草视频这里只有精品| 91宗合网| 啊啊啊啊啊啊啊啊啊啊在线观看| 久久一级无码精品毛片6| 麻豆一区二区AV天美| 99在线免费视频| 欧美日韩插逼视频| 97网址97| 强奸乱伦AV一天堂网| 久妇网| 另类小说综合网| 欧美亚洲高清不卡| www.狠狠| 超碰免费人妻人人| 国产欧美日产一区二区三区 - 国产欧美日 | 精品欧美А∨无码黑人大荫蒂| 日本伦理一区二区| 国产精品久久久吖| 夜夜夜夜爽| 狠狠中文字幕| 在线国产福利网址导航| 婷婷九月丁香| 欧美乱色| 91成人在线免费视频| 成人熟女区| 精品成人亚洲午夜电影| 一区二区三区四区久久视1| 午夜福利一区二区影院| 欧美啪啪啪91| 日本欧美成人片AAAA| 亚洲欧美碰碰| 亚洲人妖网| 久久国产视频性吧| 国产白丝精品在线观看| 久久人妻少妇| 中文字幕少妇色 | 日韩无码黄色片| 97av,com| 免费视频无码| 精品午夜福利| 黑人综合色| 亚洲超碰在线| 亚洲免费在线探花| 国产午夜在线观看| 蜜臀Av一区二区三区| 中文字幕人妻色偷偷久久皮| 国产吞精a级片激情电影| 很很热性爱视频| 91美女视频电影| 人人摸人人干| 91美女丝袜诱惑视频| 肉嘟嘟www视频在线观看高清| 91oumei| 夜夜狠狠躁日日躁色视频| 翔田千里AⅤHD无码| 熟妇高潮二区三区| 插入逼91| 啊啊啊啊好疼| 色777999综合| 国产精品丝袜久久亚洲不卡| 欧亚性爱视频免费看| 偷拍三区| 国产福利一区二| 色香综合| 亚洲天堂电影网99999| 午夜精品一区二区三区三上悠亚| 911粉嫩人妻| 丰满人妻区一区二区三| 欧美日韩婷婷中文| 熟女在线视频| 免费啪啪一级视频| 五十路熟女人妻一区二区三区四区五| 一级黄碟在线观看| 国产精品福利资源在线尤物| 色九九综合AV| 久久99精品国产| 99色综合| av大香蕉| 美女尤物人人操| 亚洲一卡二卡在线免费| 成人草草视频| 97这里都是精品| 日本一区二区三区欧美日韩中文字幕| 少妇高潮对白在线观看| 夜夜天天噜狠狠爱2021| 亚洲双插| 亚洲污污网站| 人妻天天操天天爽视频免费| 国产高清MV操逼视频| 艹精品| 亚洲一区二区三区播放在线| 色香欲综合| 插入粉嫩少妇视频| 风月影院男女十八禁| 久久综合18p| 日产国产精品中文久久婷婷| 黄页大片在线观看| 手机av天堂久久久久| 欧美日本国产日韩激情视频| 九九九九热| 久久久久九九九九九| 亚洲AV乱码专区国产噜噜亚洲| av优播| 欧美成人性爱视频大全| 国产精品亚洲免费| 婷婷五月天色| 91在线色综合| av婷婷色网| 黑人中出21连凳花野真衣| 久久97资源 网| 久噜噜| 亚洲不卡不卡中文字幕不卡| 亚洲综合影视| 久久爱超碰网| 私色综合网| 男女啪啪啪18禁网站| 美女裸体无遮挡永久免费观看网站| 美女91网址 | 五月婷婷丁香六月| 嫖老熟女A片一二三区| 亚欧日韩成人| 亲子敌伦对白在线播放| 久久六六| 欧美色青| 亚洲无码 国产无码| 亚洲无码视频免费在线观看网址!| 97色伦97色伦国产欧美| 久久女人视频| 日本 免费 一区二区三区 久久香蕉| 久久日韩精品一区二区| 97中文综合| 欧美综合网A| 午夜毛片高清免费不卡| 后入式视频国产自| 国产精品白丝www| 97免费在线观看| 无码免费在线观看黄色片| 人人弄人人摸| 欧美人与性动交a美精品| 97在线精品观看视频| 97精品国产| 成全在线观看免费观看| 强奸乱伦大香蕉| 国产精品一二三在线看| V A在线| 在线综合网| 亚洲涩涩| 99re在线观看| 91精品综合久久久久久五月丁香| 素人美腿视频网站| 蜜伊人色综合97| 亚洲色图20p| 婷婷色在线| 成人久久无码www| 另类av天堂| 99超碰网| 国产精品爱欲| 99啪啪| 亚州色交| 日本中文字幕熟妇| 天天综合~91| 久热伊人| 五月天我淫我色av| 久久性爱大全| 久久天天性久久伊人| 东北女人操比视频| 亚洲色图91| 欧美极品美女aaaaaa级黄片| 国产97视频免费观看| 不卡超碰护士AV在线免费播放| 欧美综合 站| 婷婷超| 日本福利二区视频| 日韩av色图综合| 超碰色图| 97超碰磁| 亚洲第一页色网| 青草地一本线一区二区三区| 超碰国产精品久| 大香蕉操久久| 青青国产在线拍揄自揄拍| 亚洲宗合网| 久久性爱视频免费看| 麻豆这里只有精品| 亚洲 欧美 中文 日韩超碰 | 人妻AV在线| 青娱乐 成人娱乐在线| 91成人社区| 精品传媒在线一区| 欧美亚洲尤物久久| 在线99热| 嗯嗯嗯啊啊啊操的我好爽 | 做爱A级亚欧| 亚洲情色1区| 国产路线专区| 91人妻Pr| 亚洲国产亚洲天堂| 日韩有码专区| 欧美顶级黄片AAAAA在线免费看| 人妻在线大香蕉| 午夜噜噜噜| 成人午夜高潮av猛片| 丰满高潮18xxxx| 亚洲天堂男人在线| 香港久久久| 三级精品三级在线观看| 东京热激情视频一二三区| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 十八禁啪啦拍视频无遮挡| 亚州春色| 一区不卡在线观看av| 欧美黄色片AAAAA| 97在线资源| 神马久久久久久伦理片| 日日夜夜天天| 男人天堂新| 入口操逼网站| 91ise欧美| 色在线69堂| 2019天天干| 久久社区一区二区三区| 综合色拍| 97精品视频| 美女一区二区国产精品| 麻豆国产原创AV色哟哟| 色香AV| 久久久 国产精品| 麻豆影音天美视频| 91bbbbbb| 中日高清无码操逼视频| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 无码逼| 色眯眯av| 日韩丝袜二区| 亚洲图片视频小说| 久久性视频| 少妇三P| 伊人久久久日韩一区| 在线欧美亚洲| 睡产熟女乱伦| 久草色悠悠在线视频| 亚洲激情综合另类| www.99中文字幕| 欧美99| 色97综合中文字幕| 亚洲AV永久无码一区仙野| 久久九九热| 九月丁香婷婷色| 欧美 亚洲 91| 中文字幕一区二区三区四区在线视频| 粘花网06av视频| 国内毛片无遮挡国产| 在线天堂999| 伊人黄色片| 视频二区熟女人妻| 日韩高清黄片| 色情婷婷久久五月天| 亚洲,日韩,欧美,成人播放| 色色激情| 国产精品久久久午夜夜伦鲁鲁| 人人 操人人 操人人| 一区二区蜜臀| 激情五月综合开心五月| 人妻黑丝袜电影| 操逼逼福利视频| 亚洲欧洲日韩中文字幕一区| 七久久久| 一本色道综合久久欧美| 久久天天摸| 免费一级性爱久久| 中文字幕人妻色偷偷久久皮 | 风月影院男女十八禁| 国产又色又爽又舒服的三级视频| 欧美综合第一页| 在线视频一区二区传媒| 色色福利| 精品久久久不卡一区二区| 激情抓乳插进去啪啪啪日韩| 久久久久极品| 国产中文字幕曰本毛片| 亚洲日韩精品一区二区| 密臀AV在线| 久久精品色欧美aⅴ一区二区| 欧美天天综合网| 一区二区三区成人 | 男人天堂久久精品不卡| 国产精品久久99日日| 男人的天堂Va| 久久激情亚洲精品无码?V| 欧美美女视频| 男人的天堂2019AV| 香蕉国产精品麻豆亚洲欧美日韩 | 精品少妇99| 综合熟女| 欧美天天射| 日韩情色视频| α√在线| 亚洲欧美91| 91N欧美| 国产一级不卡在线观看| 日韩十八禁| 麻豆国产成人精品| 人妻天堂综合网| 激情 欧美 亚洲 小说| 亚洲少妇激情一区二区三区| 亚洲精品a人片在线观看视| 午夜操一操| 久久久九精品| 久久 国产精品 一区| 久草尤物| 久久成人网站| 欧美成人精品A片免费一区99| A级毛片在线看免费| 中文字幕人乱码中文字的预防方法 | 精品人妻中文字幕4399| 国产精品久久久久久久久久久久久久| 先锋精品av色鲁| 九九视频黄色片| 色九久| 亚洲综合 欧美| 欧美熟妇精品黑人巨大一二三区| 秋霞一级鲁丝片A片| 亚洲性少妇| 久都青青视频| 亚洲色 国产 欧美 日韩| 激情文学欧美| 人妻人人操| 天天舔天天日天天射| 日本肉体xxxx裸交| 欧美偷拍区| 玖玖爱综合网| 人人人人人人少妇| 精品毛片久久久精品毛片| 92性色国产午夜福利在线661| 97国产精品一区二区传媒公司| 99色色| 玖玖玖玖精品国产剧情| 日本色色视频网站| 一区二区三区国产在线播放| 青青草依人大香蕉| 91熟女.com| 蜜臀久久久国产| 中文字幕一区 二区三四五 区日 日骚| 日本精品五区| 亚洲情色 自拍| 蜜乳av一区二区三区| 亚洲国产欧美日韩人妻日中文| 日本视频在线观看污污污| 啊啊啊想要| 青青草原伊人网| AV天堂丝袜| 色噜噜狠狠色综合日日| 精品人妻1区| 一中国女人毛片水真多| 97久久天天综合色天天综合色电影| 极品五月天噜噜| 婷婷五月影院| 国产成人一级av88| 超碰九7免费| 校园春色综合香蕉| 中文字幕 一区二区 亚洲无码| 岛国片在线观看视频亚洲| 一级特级aaaa毛片免费观看| 亚洲91在线播放影院| 免费日韩黄片| 男人的天堂 在线一区| 九九九九九九九| 宅男91视频在线播放| 天天影视网综合少妇| 男人的天堂不卡一区二区 | AA丁香综合激情| 亚洲精品一二区| 你懂的在线观看区国产| 日韩在线欧美精品一区二区| 亚洲一区在线观看欧洲 | 九九热精品视频六| 亚91网| 欧美的精品的视频| 韩国国产欧美情侣视频在线| 色 亚洲 91| 天天摸夜夜操视频| 日本不卡三级网在线播放| 国产精品情侣啪啪| 欧美亚综合色图| 日本狠狠干| 91精品丝袜在线观看| 国产97色在线| ji熟女.com| A 在线网址| 色呦呦呦在线观看视频| 岛国黄色大片网站| 波多野42部无码喷潮在线观看 | 人人操肉肉| 精品久久久av无码免费| 久久久久久九九九九九| 干妹子| 天天操天天日天天干| 无码人妻丰满熟妇区毛片| 国产福利夜| 天堂伊人久久| 天天日天天射天天干| 日本人妻一区二区| 伊人色综合超碰| 久久久久网站-538在线视频-欧美永久乱码| 18禁久极品美女久久哦哟呀!| 国内操逼视频二区| 亚洲AV在线资源| 91精品国产91熟女| 天美传媒av 在线| 美女网站91| 欧洲在线性爱视频| 久热伊人| a片自拍直播视频| 亚洲 无码 偷拍| 亚洲日韩电影| 澳门人妻久久| 青青草在线视频人人想人人上| 久久一二三级一一一| 久久婷婷五月天| 97青青操视频| 二区熟妇韩日| 九九九精品一区二区无码| 久久久久久中文| 国产精品第一页国产大屁股视频免费区| 欧美综合色图片| 日本 情色 1区| 深夜激情| 日本在线观看网址| 国产操逼逼网| 日韩午夜啪啪视频| 男男H黄动漫啪啪无遮挡网站| 日本在线视频导航| 热久久91婷婷| caopeng97| 99re这里只有精品3| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 色综合久| 久久久久国产亚洲一区欧美色图日韩 | 久久超碰爱| 夜夜骑操视频| 97在线观视频免费观看| 91精品人妻一品二品三品| 秋霞Av理论一级在线| 亚欧无码线免费观看视频| 家庭乱伦国产精品| 天天色黄色影院天天操| 日本日逼视频网| AV大香蕉| 精品视频日日夜夜| 日韩欧美被操黄免费观看| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 密臀AV在线| 九9精品| 日韩欧美中文字幕搭讪巨乳美人妻视频| 青草草免费网站av| 亚洲91av| 韩日精品福利视频一区不卡在线免| 亚洲国产精品无石码久久| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 久久啊啊| 免费视频在线一区二区不卡| 加勒比在线观看一区二区| 91强热人妻| a网站免费观看| 大香蕉亚洲中文| 国产美女91视频| 国产AV线| AV一区观看| 久久99久久99精品免视看婷婷| 欧美熟妇精品黑人巨大一二三区| 精品天堂| 亚洲色综合| 午夜精品久久久久久久| 国产视频人人网| 激情小说五月天| julia国产在线| 国产男人又猛又粗又爽| 91日产欧美| 东京热毛片177b2viP| 九九色精品| 大香蕉一人| 人人摸人人摸人人干| 久久超碰98| 天天做天天爱| 91成人在线免费视频| 按摩中文字幕| 99精品综合久久久久五月天| 日韩一性一交一A片俄罗斯| 好看的久久不射无码影视影院| 精品久久无码午夜福利| 97人妻色| 2017亚洲天堂| 91精品国产高清久久久久久,亚洲成人 | 久精品无码av一区二免费国产在线观看| 久草成人影片| 色拍偷亚洲| …亚洲黄色厕厕女女在线播…| 日韩欧美字幕亚洲一区二区| 亚洲青青草| 操我无码| 综合色久欲| 欧美性爱另类综合| 超碰 另类 欧美| 99精品九九九九九九| 狠狠中文字幕| 亚洲国产综合久久久性感熟妇| 欧洲精品一级二级精品综合视频综合| 思思99热| 国产三级中文字幕粉嫩| 天天日天天搞天天干| 亚洲欧美精品91| 天天天干977| 国产精品无码论坛| 91久久久视| 久久久精品网站| 日韩97超碰中文字幕| 91痴汉| 超碰99在线观看| 999熟女精品| 午夜福利成人免费视频| 偷拍超碰| 青娱乐国产剧情av一区| 熟妇人妻一区二区| 亚洲AV成人无码一二三久久 | 欧美亚洲色的图| 国产精品亚洲高清在线| 青青草视频久久久久| 亚洲色图尤物视频| 欧洲精品一区二区三区| 熟女乱3伦999| 丝袜夫妻自拍| 熟女人妻精品一区二区视频| 色五月激情综合网| 9久久久久久| 91狠狠综合久久久| 日本二区不卡| 蜜臀久久99精品久久综合| 久久丁香久草综合网|