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

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(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)成一門“帶類的 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)邦而不是一門單一語(yǔ)言1.1 為什么很多人學(xué) C 越學(xué)越混亂原書(shū)作者在條款 01 里提出了一個(gè)非常經(jīng)典的觀點(diǎn)C 不是一門單一語(yǔ)言而是由四個(gè)次語(yǔ)言組成的“語(yǔ)言聯(lián)邦”。這四個(gè)次語(yǔ)言分別是C、面向?qū)ο蟮?C、模板 C泛型編程、以及 STL。我第一次讀到這個(gè)說(shuō)法時(shí)覺(jué)得太抽象了但工作幾年后回頭再看這可能是全書(shū)最值得反復(fù)咀嚼的一句話。很多人覺(jué)得 C 難學(xué)本質(zhì)上是因?yàn)檫@四個(gè)次語(yǔ)言的使用方式、編程范式、慣用法差別太大。用純 C 的思路寫(xiě) C你會(huì)覺(jué)得類、命名空間、異常都是多余的負(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ú)類、無(wú)模板、無(wú)異常面向過(guò)程底層模塊、嵌入式、系統(tǒng)調(diào)用封裝指針、內(nèi)存布局、結(jié)構(gòu)體、全局函數(shù)面向?qū)ο?C類、封裝、繼承、多態(tài)、虛函數(shù)業(yè)務(wù)模型、架構(gòu)分層、接口設(shè)計(jì)抽象、對(duì)象生命周期、接口與實(shí)現(xiàn)分離模板 C編譯期計(jì)算、類型推導(dǎo)、泛型抽象容器、算法、類型安全的工具庫(kù)類型層面的復(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ǔ)言抽象基類、虛函數(shù)、工廠模式寫(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)銷常量引用往往更合適而在模板代碼里你又得考慮引用折疊和完美轉(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ǔ)言分類發(fā)現(xiàn)真正屬于“面向?qū)ο?C”的代碼只占三成另外三成是 C 風(fēng)格的實(shí)現(xiàn)四成是 STL 和模板的混合。這個(gè)分類幫我找到不少壞味道——比如我在 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í)際上是講“不要依賴預(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)有類型檢查。你在一個(gè)需要 double 的地方使用了 int 宏常量編譯器不會(huì)給出任何警告一旦協(xié)議格式變化或者數(shù)據(jù)類型升級(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)“類似宏”的效果對(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)的常量。如果常量只在類內(nèi)使用而且你想讓它在類內(nèi)“可見(jiàn)”C11 之前有一種常見(jiàn)寫(xiě)法class GamePlayer { private: static const int NumTurns 5; // 常量聲明 int scores[NumTurns]; // 用它來(lái)聲明數(shù)組 };這種寫(xiě)法依賴“類內(nèi)初始化器”和“編譯期常量”的結(jié)合。C11 之后static constexpr 更推薦比如 static constexpr int NumTurns 5;語(yǔ)義更明確。但這里有一個(gè)“歷史遺留坑”如果你只是聲明了 static const int NumTurns 而沒(méi)有在類外定義取它的地址例如 int* p NumTurns;時(shí)某些編譯器會(huì)報(bào)鏈接錯(cuò)誤因?yàn)槿鄙俣x。解決方法是類外補(bǔ)一行 const int GamePlayer::NumTurns;而 enum 不存在這個(gè)問(wèn)題——enum 沒(méi)有地址的概念。這就是條款 02 提到的 enum hack當(dāng)你想在類內(nèi)聲明一個(gè)編譯期整數(shù)常量又不想讓它變成可被取地址的對(duì)象時(shí)enum 是一個(gè)非常合適的工具class GamePlayer { private: enum { NumTurns 5 }; int scores[NumTurns]; };enum 的意義在于它既是編譯期常量又有類型約束而且不能被取地址也沒(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ù)的宏是一門“危險(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)鍵字不僅類型安全參數(shù)只求值一次而且行為可預(yù)測(cè)templatetypename T inline T callWithMax(const T a, const T b) { return a b ? a : b; }注意這個(gè)模板版本接受任意類型而且使用 const 引用避免了不必要的拷貝。這一點(diǎn)是宏無(wú)法做到的宏沒(méi)有類型概念不會(huì)幫你做拷貝優(yōu)化也不理解引用語(yǔ)義。在熱路徑上inline 函數(shù)有機(jī)會(huì)被內(nèi)聯(lián)展開(kāi)性能上與宏接近但可調(diào)試性和可讀性完勝。我自己的心得是不要試圖“完全消滅宏”而是要弄懂宏能做什么、不能做什么。配置文件里的版本號(hào)、條件編譯開(kāi)關(guān)、以及那些必須依賴預(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ì)位置能直接消除一整類編譯期問(wèn)題。3.2 函數(shù)返回值加 const防止語(yǔ)義被誤用const 不僅可以用在參數(shù)和變量上還可以修飾函數(shù)返回值。原書(shū)舉的例子是重載運(yùn)算符。像 operator* 返回 const Rational能防止用戶寫(xiě)出 (a * b) c 這種荒謬的代碼。這個(gè)例子放在今天某些人眼里會(huì)覺(jué)得小題大做但它背后的問(wèn)題在自定義類型里非常常見(jiàn)。我自己遇到過(guò)類似的場(chǎng)景某個(gè)類實(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ù)這決定了你的類能否被 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í)幾乎所有人都能秒懂查詢長(zhǎng)度是個(gè)只讀操作但為了提升后續(xù)查詢速度需要第一次調(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)題非常擰巴有的變量不初始化就是垃圾值有的類成員的默認(rèn)構(gòu)造會(huì)自動(dòng)初始化有的類型比如內(nèi)置類型在你聲明時(shí)不給你任何默認(rèn)值。我剛工作那年就吃過(guò)虧一個(gè)局部 bool 變量沒(méi)初始化剛好是 true程序走錯(cuò)了分支排查了一下午。這里要分清兩個(gè)概念初始化和賦值。初始化是“對(duì)象一生下來(lái)就有值”賦值是“先有對(duì)象再把值放進(jìn)去”。對(duì)于內(nèi)置類型這兩者在形式上看起來(lái)一樣但對(duì)于類類型初始化調(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)銷有時(shí)還會(huì)導(dǎo)致不可預(yù)期的行為比如引用成員根本不能賦值。我對(duì)這條規(guī)則的執(zhí)行標(biāo)準(zhǔn)很簡(jiǎn)單所有內(nèi)置類型成員、指針成員一律在聲明處初始化或構(gòu)造函數(shù)初始化列表中顯式初始化所有類類型成員能用初始化列表就用初始化列表。哪怕你覺(jué)得“反正默認(rèn)構(gòu)造也是空的賦不賦值都一樣”也要把初始化列表寫(xiě)出來(lái)因?yàn)榇a的可維護(hù)性來(lái)自“一眼能看出這個(gè)成員的值從哪里來(lái)”而不是靠推理。4.2 初始化列表與成員聲明順序的“隱形炸彈”用初始化列表時(shí)有一個(gè)特別隱蔽的規(guī)則成員的初始化順序只由它們?cè)陬愔械穆暶黜樞驔Q定與初始化列表的書(shū)寫(xiě)順序無(wú)關(guān)。也就是說(shuō)即使你在初始化列表里把 y 寫(xiě)在 x 前面如果類中先聲明 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 之類的選項(xiàng)或者運(yùn)行時(shí)輸出異常才會(huì)發(fā)現(xiàn)。我的建議是把初始化列表的書(shū)寫(xiě)順序永遠(yuǎn)和成員聲明順序保持一致并且盡量避免在成員初始化時(shí)依賴其他成員的值。依賴關(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ì)象、類里的 static 對(duì)象、函數(shù)里的 static 對(duì)象以及文件作用域的 static 對(duì)象。當(dāng)一個(gè) static 對(duì)象的初始化依賴另一個(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; }這種做法被稱為 “Meyers’ Singleton” 模式雖然這里不強(qiáng)調(diào)單例但這個(gè)技術(shù)在單例場(chǎng)景最常用。C11 之后函數(shù)內(nèi) static 對(duì)象的初始化是線程安全的編譯器會(huì)生成相應(yīng)的保證一次性初始化的代碼所以這個(gè)方案還順便解決了多線程環(huán)境下的初始化競(jìng)爭(zhēng)問(wèn)題。我在一個(gè)后臺(tái)服務(wù)里用這個(gè)方式管理配置、日志、連接池等組件啟動(dòng)順序問(wèn)題從根上消失了。這個(gè)技巧也有需要注意的地方如果兩個(gè)函數(shù)的初始化存在循環(huán)依賴A 初始化時(shí)需要 BB 初始化時(shí)需要 A這個(gè)方案同樣救不了你只能靠重構(gòu)拆解依賴。另外在 C11 之前的老編譯器上函數(shù)內(nèi) static 初始化的線程安全問(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 的前置分類讀完條款 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ì)的類我會(huì)關(guān)注接口設(shè)計(jì)、const 正確性、是否違反開(kāi)閉原則一個(gè)模板工具函數(shù)我會(huì)關(guān)注類型推導(dǎo)、引用折疊、是否需要 SFINAE 或概念約束。這種分類思維能讓你在面對(duì)“這代碼寫(xiě)得好不好”時(shí)給出一個(gè)更精準(zhǔn)的答案而不是籠統(tǒng)地說(shuō)“感覺(jué)不太優(yōu)雅”。C 的“好”永遠(yuǎn)是相對(duì)的同一段代碼放在 C 風(fēng)格模塊里可能不倫不類放在模板庫(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í)你的類已經(jīng)準(zhǔn)備好了。5.3 初始化順序問(wèn)題編譯器不是你的朋友而是你的敵人我最后想強(qiáng)調(diào)的還是初始化。每次看到有人自信地說(shuō)“對(duì)象反正會(huì)默認(rèn)初始化”我就想起純 C 時(shí)代的局部變量它不會(huì)默認(rèn)初始化。C 在類類型上引入了默認(rèn)構(gòu)造的概念但它依然不會(huì)幫你初始化內(nèi)置類型成員。很多人以為的“默認(rèn)初始化”實(shí)際上是“默認(rèn)不初始化”直到程序在某個(gè)隨機(jī)時(shí)間點(diǎn)爆出奇怪的值才意識(shí)到。我的建議是給自己定一條鐵律所有需要初始化的對(duì)象要么在聲明處初始化要么在構(gòu)造函數(shù)的初始化列表中明確寫(xiě)出。不依賴“默認(rèn)值”不依賴“某個(gè)函數(shù)會(huì)幫我填”不依賴“運(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è)入口依賴另一個(gè)的版本號(hào)。開(kāi)發(fā)環(huán)境一切正常發(fā)布到線上偶發(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í)去想它們的初始化依賴關(guān)系。還有一點(diǎn)const 成員函數(shù)里的 mutable 用得多了會(huì)讓類的線程安全性變差。比如上面那個(gè)緩存長(zhǎng)度的例子如果兩個(gè)線程同時(shí)調(diào)用 length()mutable 的緩存字段可能被并發(fā)寫(xiě)。實(shí)際工程里要么用 std::call_once 或 std::mutex 保護(hù)緩存邏輯要么干脆在文檔里注明這個(gè)類不是線程安全的。我后來(lái)給自己定了一個(gè)原則mutable 只能用于“線程邊界明確”的場(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
返回資訊列表
网友自拍第1页| 九七人妻在线| 大香蕉草草| 天天操夜夜操狠很操| 色蜜AV| 色婷婷综合久久中文字幕雪峰| 午夜啊啊啊| 啊啊啊啊啊操我视频| 东京热亚洲一区二区| 91女优在线观看 | 99久久e免费热视| 偷拍欧美激情| 精品国产AV一区天美传媒| 青椒国产97在线熟女| 极品内射| 色在线亚洲视频www| 久久免费老司机精品| 性感美女91影视| 欧美人妻久久精品二区三区| 婷婷国产精品一区二区| 亚洲码专区| 绑缚麻绳人妻寝取完整版| 精品91| 97视频观看| 偷拍盗拍亚洲色图图片| 色月天AV导航| 国产精品无套内谢| 一二三四区操操Av| 日本三级韩国三级99| 女上位精品在线| 日韩欧美亚洲自拍偷拍| 久插综合| 偷窥自拍亚洲天堂网爆| 亚洲精品久久久久毛片A片拉屎| 99精品视频在线观看| 97在线日韩中文字幕| 女人 A一级| 日韩大香蕉精品在线视频| 亚洲另类小说卡通动漫| 国产精品久久久久久久久久久久久久久 | 日熟女| 麻豆天美电影一区二区| 亚洲综合91| 91狠婷| 曰韩人妻中文字幕在线| 蜜伊人色综合97| 操操逼视频| 欧美,亚洲,日韩,v,天堂,手机在线观看| 屁屁影院一区二区三区国产| 大香蕉线| 亚洲综合在线高清| 欧美日韩*字幕一区| 日噜夜夜夜夜夜夜夜夜夜夜爽爽爽爽爽爽爽爽爽爽爽爽 | 天久久久噜噜噜久久国产精品爽爽 | 午夜黄色免费在线观看| 黄页大片在线观看| AV中文字幕三四五| 370p日韩欧美亚洲精品| 亚洲 欧美日韩 另类| 国产精品久久久啊| 亚洲高清男人天堂| 亚州色图第三区| 欧美BT 亚洲色图| 深夜操逼网| 一级AV性爱| 嫩草 我啊~嗯~在线| 色婷婷成人| 欧美成人一区二区三区在线播放| 超碰色男人操熟女| 久久久神马影院| 国产大学生高潮在线播放| 久久在线观看免费视频| 中文欧丝袜诱惑| 欧美亚洲第一页| 极品色综合| 亚洲一区二区三区中文字幕| 欧美激情精品久久久久久| 日本在线不卡123| 综合天天。| 婷婷色网| 国产亚洲日韩欧| 欧美色性情| 国产成人无码高清| 少妇被c 黄 免费观看| 日日A∨| 欧美亚洲中文字幕| 免费一级性爱久久| 96精品久久久久久久久久| 精国久久一区二区三区98| 久久99热这里只频精品6学生| 免费一级精品啪啪视频| 日本操逼视频免费| 91欧美网| 99热这里只有精品18| 欧美天天综合站| 婷婷国产精品九区| 98一区二区精品| 日韩欧美字幕亚洲一区二区| 亚洲激情在线观看一区| 看全色黄大色大片免费视频| 国产麻豆91欧美一区二区久久婷婷国产精品| 97爱欧美| 久久a久久| 午夜超爽| 中国AV美女| 天美传媒AV在线| 夜夜嗨TV| 欧美手机在线综合| 福利五区| 综合久久9| 夜夜爽夜夜摸夜夜操免费视频| 国产精品色哟哟| 国产女上位好爽在线| 丁香五月大香蕉| 97天天| 国产美女口爆吞精| 蜜乳AV免费观看| h无码动漫在线观看| 精品无码久久久久久久久果冻糖心| 中文字幕亚洲欧美在线不卡| 大香蕉在线视频15| 欧美亚洲首页| 亚洲精品官网在线观看| 欧美青青视频| 精品午夜福利| 亚欧免费| 日韩精品资源专区二区| 亚洲图片日本AⅤ欧美在线| 精品视频在线观看| 午夜电影在线观看无码专区| 91成人在线| 老师充足的奶水小说| 日本ZZ高免费A级视频| 激情专区综合| 激情啪啪拍91| A一区片| 我爱操| 97综合国产精品高潮久久| 国产成人拍国产亚洲精品| 欧美黑人91| 中文字幕在在线观看网站| 艹精品| 欧美亚洲第一页| 俄罗斯及免费在线看| 精品人妻久久久久一区二区三区| 91熟女视频网| 无码二级三级| 亚洲婷婷丁香在线| 秋霞一集毛片观看| 午夜操逼不卡| 日韩高清黄片| 蜜乳AV网址| 另类图片五月| 国产精品麻豆免费视频| 富二代亚洲精品99| 亚洲、日韩、综合、另类| 中文字幕黑人大片| 亚洲激情综合| 这里是精品| 国产久久一区二区三区野外在线| 日日干男人的天堂| 99草精| 91制服丝袜| 欧美性爽xyxOOOO| 无码粉嫩白虎一线天b区| 九九九不卡| 97在线免费| 2017人人操,人人摸| 国产极品99热在线播放69| 韩国一级做A片免费的| 91精品综合久久久久久五月丁香| 中文字幕日产av人| KK色在线影院| 亚洲精品电影| 亚洲精品中文字幕一区在线视频 | 蜜臀网 一区| 操啊国产| 色爱综合网| 青久操| 人妻91少妇| 中文字幕一区二区三区字幕| 九九99久久| 精品一国2| 欧美综合色| 日韩激情电影中文字幕| 久久精品色欧美aⅴ一区二区| 久久国产视频性吧| 国产精选视频| 中文字幕亚洲热播人妻| 女生自91网站| 中国AV美女| 日本久久久久久久久| 欧美色综合图片| 天堂v无码免费视频| 91美女中出| 日韩在线观看AV| 亚洲高清无码AAA久久久精品| 99re6国产精品99re在线| 日韩欧美中文字| 韩国手机不卡无码三级视频| 亚洲人在线成线成人| 日韩少妇无码| 丰满人妻av一区二区三区| 久久精品国产久精国产| 被体育老师抱着c到高潮| 97视频在线观看高清资源| 男人午夜天堂| 综合久欧洲| 美国一区二区三区视频| 大香蕉伊然在亚洲91| 人妻熟女av国产网站| 日本日逼高清| 亚洲AV免费在线观看| 亚洲精品97| 狠狠操夜夜操蜜桃视频三区| 黑白配性爱AV成| 91蜜桃婷婷狠狠久久综合9色| 亚洲最新中文字幕免费| 九久9热| 国产白丝在线| 日韩精品一区二区三区色欲| 91亚洲欧美激情| 日韩有码免费视频| 免费亚洲黄色视频在线观看| 欧美图片校园春色| 大香蕉十区| 久久久久久久亚洲Av无码| 亚洲欧洲日韩中文字幕一区| 国产偷拍自拍在线视频| 日韩欧美日韩| 加勒比人妻综合| 99热成人| 黄页视频网站野外| 久久久精品| 亚洲大色鬼| 欧美黄色图片| 丁香六月综合激情| 午夜寂寞欧美| 五月激情综合网| 久久永久无码人妻视频| 操少妞在线视频| 欧美色图亚州激情| 天天干天天日天天射黄色| 国产亚洲精品自在线亚洲情侣| 综合网欧美| 色原狠狠天天天| 91 国产丝袜在线播放-百度| 熟女一区二区三区| 碰超人人在线一区二区三区| 一区=区三区视频| 亚洲一区日韩| 97超碰磁| 国产女人与拘做受视频免费| 亚洲女优有码无码高清| 久久久草草精品| 免费99精品国产自在在线| 日韩中文字幕2020| 日日日骚女人精品| 欧美色日本| 国产精品久久久亚洲一区| 78超碰| 校园春色欧美色图| 区日韩亚洲乱码av电影| 隔壁邻居波多野结衣中文字幕| 91人妻人人妻| 欧美曰韩国产精品| 日本一级二级三级网站| 极品销魂美女一区二区| 97综合网| 淫荡少妇免费| AV天堂丝袜| 国产午夜福利视频在线| 色偷综合| 97超碰站| 亚洲国产精品9999在线观看| 国产 无码 一区二区| 五月天综合网| 九九九九欧美| 欧美资源| 日韩 欧美 另类 人妻| 亚洲精品乱码线路中文字幕| 牛黄色久午久| 91精品国产综合久久久蜜臀| surenchaopeng| 亚洲色宗合| 在线不欧美| 乱伦一二三区| 婷婷久草一区二区三区| 亚洲日韩东京热一区| 97伊人超碰| 国产对白刺激视频| 97干在线看| 久久久性爱视频| 97日韩欧美亚洲| 四虎影视国产精品| 免费伦费视频在线观看| 夜夜操夜夜爽夜夜高潮| 91人人| 偷拍导航视频网站| 精品免费一区二区三区在线亚洲人成| 亚洲精品黑丝| 国产女人高潮嗷嗷嗷叫小说| 伊人影院在线理论播放| 日韩欧美女求操每天更新| 在线观看成人性爱免费小视频| 成人七区| 丰满丝袜少妇AV| 国产高清视频无码在线| 国产又大又粗又长视频在线| 一区二区视频在看| 丰满人妻-区二区三区免费| 中文熟女五十乱码在线| 欧美1区二区三区公司| 欧美一二三区四五区| 天天天天天天天天天天干美女| 亚洲丝袜天堂| 亚洲成人ab| 色色色综合网| 天天噜| 极品粉嫩一区二区| 国产成人精品必看 | 激情婷婷丁香网| 丁香五月天激情网站| 亚洲色图第一页| 女欧美一区二三区| 免费亚洲国产精品久久一区| α√在线| 综合久久少妇中文字幕| av72网| 五月天久久综合网| 亚春色色| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 日本熟妇浓毛hdsex| 亚洲本色精品一区二区久久| 激情五月天网站| www.男人天堂| 少妇超碰在线| 99久久这里只有精品| 免费岛国一级片| 久久精品国产精品亚洲艾通辽熟妇| 日本高清一区二区在线| 精久久久91| 综合久| 99热免费| 欧亚 另类 久| 蜜乳Av成人片网站| 一区二区三区色综合| 日韩97视频| 亚洲字幕一区二区| 好好的日:com久久九九| 欧美日本中字另类在线| 亚洲丰满很很操| 成人日本视频人妻在线| 人妻久久一区二区三区 | 久久精品国产AV一区二区三区| 999狠狠综合| 91处女在线观看| 亚洲综合影视| 婷婷伊人网| 亚洲男人天堂手机版| 久操热线| 精品无码久久久久久久杏吧| 大肉棒导航| 丁香五月激情综合国产| 日韩免费簧片| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 人人色97| 黄色AAAAAAAAAAA大片| 欧中美三级一区二区三区| 亚洲午夜福利在线影院 | 国产久久久久久| 九九九精品色乱九九九| 黑人天8A∨高清网站| 国内精品伊人久久久久影院会| 亚洲天堂一二| 黄页18禁| 这里只有精品视频| 日本一级性爱| 欧美色性爱| AA级电影三区| 色亚州人久干视频在线观看免费版| 亚洲av影音先锋| 亚洲丨在线| 久久久久久久久久久久欧美日| 澳门特级毛片免费观看| 日本一区二区亚洲综合| 欧洲亚洲国产综合在线| aaa亚无码专区| 99超碰网| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 青青操青娱乐| 久久久久久久六六| 艳尻美人妻| 亚洲人在线| 婷婷五月天福利| 国产91乱伦| 精品人成视频在线观看| 亚熟hd视频在线| 日韩在线视频1234| 97天天搞在线| 99re6久热只有精品6在线直播 | 俄罗斯一区二区视频在线观看| 一起草视频在线| 骚妻少妇精品性色无码四色A V| 欧美性暴力猛交XXXX | 91国产大片| 天天做天天爱天天爽AV| 1204金沙人妻懂旧版免费| 香蕉综合网| 免费视频在线观看啊啊啊啊啊| 欧美熟妇乱码在线一区| 天天看高清麻豆| 东北女人性交| 国产精品一区二区手机看片| 无码人妻精品一区二区中文| 熟女五十路一区二区三| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 久久久久久久久久久久欧美日| 天天舔天天日天天射| 加勒比久久av| 9.1小视频| 亚洲第一页色网| 免费一级性爱久久| 综合色图区| 韩日自拍| 免费AV中文网在线观看| 丰满少妇乱子伦精品无| 国产馆极品诱惑| 91精品人妻啪啪间| 亚洲h片在线免费观看| 久热超碰| 国产自啪精品视频网站黑丝| 婷婷色色五月天福利| 日韩精品 视频一区二区| 天天干,天天日| 91性高| 成人一道本免费视频| 国产精品一二三免费网站| 2003天天干夜夜操| 天天日天天干天天操| 思思热影视| 成人女人国产| 九九热超碰| 天天舔天天日天天射| 激情婷婷综合久久| 在线人人人人人人精品超 | 加勒比综合九九99视频在线播放| 国产97免费视频| av资源在线观看少妇| 亚洲91综合| 成人免费福利在线观看| 久久精品综合| 国产成人精品亚洲日本| 九九九国产精品| 精品免费视频国产一区| 国产13区| 亚洲精品97| 亚洲精品一二三四区| 豆花视频操逼网址| 999热日韩精品| 国内外色色色色色成人视频| 91美女片在线| 99色在线| 91天天| 60秒免费小视频| 九九干| 亚洲狠狠入| 曰韩精品九九无码| 午夜小电影在线插入淫高潮| 9997se| http://qxhbdz.com| 蜜乳Av成人片网站| 九九九不卡| 亚洲综合97中文网| 草草网站影院白丝内射| 无码天堂| 日曰骚久久精品| 私色综合网| 日本国产欧美高清在线| 欧亚日韩一区在线| 高清孕妇孕交 交孕妇| 日韩性色b| 丝袜剧情| 日本操逼无码| 欧美丝袜中文字幕07在线| 嗯嗯嗯啊啊啊在线免费观看| 欧美中文狠| 中文字幕精品资源在线| 天天久久| 中日韓欧美高清| 日本道日本道中文字幕日本道最新日本道在线观看 | 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 久久久91福利姬| 污到发麻的视频 国产| 91成人在线免费视频| 欧美传媒| 岛国在线免费视频| 操逼逼一区视频| 女人18精品一区二区三区| 一级黄碟在线看| 婷婷五月丁香五月| 色色色999| 久久爱97| 欧美图片色五月天| 日逼97| 国产精品噜噜噜日日日| 黑人性欧美| 精品人妻一区二区三区四区| 干B网| 极品色| 成 人 A V免费视频在线观看| 东京热男人的天堂| 蜜乳成人AV| 精品久久久久久中文| 人人操人人狠狠操| 97资源超碰| 色天堂在线观看| 欧美色老汉| 久久久久久久97| 人人操人人摸人人看人人插| 综合色图区| 亚洲中文制服诱惑| 亚洲偷拍欧美激情| 97在线观| 四虎影院成年人片| 国产情色在线| 99在线观看视频在线高清| 啊啊啊啊啊啊好多水| 99精品九九九九九九| 97爱啪| 肏逼视频日本| 午夜免费视频1000| 在线情色电影 91大 | 色九九九九| 日韩无码操逼片| 日韩一级免费性爱| 国产精品国产| 日本影视久久免费| 女人高潮大叫一级毛片| 欧美大片天天看| 欧美玖玖爱免费玖玖| 操死我了嗯嗯嗯| 日韩欧美中文字亚洲慕| 国产第12页| 性爱久久| 久久久日本电影| 日韩精品一区二区三区色欲 | 久久久新亚洲AV| 五月丁香久久| 亚洲 欧美 色图| 被体育老师抱着c到高潮| 国产综合久久久鬼色| 天堂男人网| 欧美日日网| 精品视频一区二区| 人人手机欧洲亚洲国产人妻| 69一区二区三区| www色色com| 亚洲欧美综合图片| 91久精品| 国产福利在线视频网站| 一本久道久久综合狠狠爱| 亚洲性感丝袜诱惑在线观看| 国产福利小视频高清在线观看| 欧美日不卡| 9久在线视频只有精品| 色婷婷成人综合| 懂色中文一区二区三区| 91激情综合| 亚洲欧美精品福利在线| 亚洲色图一区二区三区| 日本精品国产视频| 亚州操逼图| 综合熟妇一区二区三区| 黄色视频特级毛片| 久久久九九九| 久久99草| 91在线视频免费中出| 亚洲欧美一区二区网址| 国产乱码久久久| 超碰 另类 欧美 | AV99热18这里只有精品| 97超碰色中文字幕| 男女91| 91热爆在线| 91成人久久| 天天干18禁| 好吊色一区| 涩五月婷婷| 全球成人中文在线| 久久久久女教师免费一区| 禁止观看美女黄| 日本肉体xxxx裸交| 久久久无码av精| 热无码中文亚洲H一道本一区二区| 91爱欧美| 好舒服视频| 久久av网| 精品久久99| 亚洲一区中文字幕一区| 亚洲中文字幕在线视频一区二区| 国产精品97超碰| 强奸熟女一区二区三区| 免费看污网址| 日韩99神马视频播放| 亚殴在线| 日本999精品视频| 美女人妻色网站| 日韩免费看在线黄色片| 日韩激情无码影院| 国产又黄又爽| 岛国大片国产| 91操人| 视频黄色国产一级| 色狠狠 - 百度| 日本一区二区不卡精品| 第一高清av中文字幕| 新版天堂中文资源8在线| www国产天美久久久| 乱伦色图网址是多少| 久草免费福利在线播放| 粉嫩绯色AV一区二区在线| 久久久97| 99精品视频在线观看免费| 日韩在线一区高清在线| 国产精品午夜高潮呻吟久久av| 亚洲综合激情五月久久| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 精…码一二三区| 狠狠干91| 美国aaaaa一级黄片| 日日狠狠久久偷偷色综合免费| 五月综合久久| 欧美日本视频一区| 亚洲无码成人精品| 国产做?爰片久久毛片?片美国| 操逼片国产| 99自拍视频| 玖玖蜜臀资源网| 毛片麻豆91糖心精品毛情片| 福利视频合集| 在线观看日韩av不卡| 有码免费观看| 国产9熟妇视频网站| av在线播放国产一区| 污啪啪啪视频| 天天日骚逼熟女| 免费1级a做爰片观看| 精品少妇一区二区三区在线视频| 91色伦综合| 色综合V| 玖玖97综合| 综合色区偷拍| 欧美国产日韩高清在线| 热热色色综合| 中文字幕久热视频在线| 男人的天堂,欧美亚洲另类国产日韩,日本高清一区二区 | 天天天天天超碰| 丰满人妻-区二区三区免费看| 青娱乐国产剧情av一区| 国内精品伊人久久久久影院会| 九九九久久久久| 国模久久在线| 天堂а√在线最新版在线| 超碰97色色| 男女国产精品| 亚洲色婷婷| 99久久综合| 无码精品一区二区三区潘金莲| 久久精品中文| 国产AV色黄看到爽| 亚洲欧美一区二区不卡视频播放 | 少妇二级| 2019精品国产无码成人| 97伪v| 国内精品a| 99热思思| 亚洲色色探花| 中文字幕乱亚洲美女精品一区| 综合激情五月丁香| 91久久免费视频互動交流| 亚洲有码第一页| 99热在线播放| 玖玖爱在线视频免费观看| 97久久久精品| 激情小说五月天| 97综合网| 97一区二区三区视频| 日本国产高清色www视频在线| 9997se| 少妇无码太爽| 91麻豆va国产精品| 日本成熟少妇A∨网站| 色婷婷婷五月天激情四射| 日韩成人大片在线观看| 丰满熟女一区二区三区在线播放| 亚洲淫乱骚妇AV| 久色网| 亚洲精品国产无码高清| 日本淫乱女一区二区三区视频| 97bbn| n1038 一二三区| 免费观看有码高清视频| 91啦人妻| 香蕉精品二区二区| 97人人爱人人乐| 欧美淫乱视频| 亚洲在线A| 一区二区三区日韩欧美| 久久人妻丝袜一区二区三| 99热99色| 久妇网| 超碰97起碰| 伊人AAA| 亚洲熟妇极品| 亚洲国产无码精品首页久久久| 精品蜜乳AV免费观看| 少妇贴图| 日韩一级二级三级在线不卡观看完整| 激情视频图片| 亚洲精品蜜桃久久久| 亚洲国产一级中文综合久久天堂在线免费观看 | 激情一区二区| juliaann丝袜| 亚洲无 码A片在线观看麻豆| 少妇一区二区三区| 老熟女乱伦一区| 男女做爰猛烈动高潮A片免费应用| jizz啪啪| 黄片不用下载在线观看| 性在久久久久久| 日韩午夜精品一区二区三区电影| 人人玩人人添人人澡免费| 国产日韩欧美中文在线播放| 一区二区三区视频在线观看免费| 欧美 亚洲 偷拍自拍| 91强奸乱轮| 欧美制服网站美腿丝袜| 97网址97| 2019天天干| AAAAAAAAA黄片| 色香色欲天天综合网天天来吧| 亚洲aV性爱| 久久AV无码网址| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 三级日韩一区二区三区| 国产99久久99热这里只有精品15| 免费在线观看国内色片网站网址| 久久精品人体| 加勒比色99999| 亚洲久久久| 欧美熟妇人体| 丝袜视频网国产90| 琪琪精品免费一区二区三区| 91成人在线免费视频| 成人熟女视频一区二区三区| 精品九区| 国产一区二区三区精品观看啪| 久久国产对白激情浪潮| 青青草原伊人网| 五月天丁香婷婷综合网站| 男人天堂.AB| 亚洲精品97久久| 亚瑟国产精品久久无码| 亚洲AV资源| 欧美性暴力猛交| 日本国产欧美高清在线| 中文字幕欧美精品亚洲日韩蜜臀| 欧美午夜视频免费观看| 91红杏| 一级性爱视频免费观看| 农村妇女一级二级三级视频| 人妻大香蕉| 欧美一区二区亚洲天堂| 青青草色AV| 亚洲色色探花| 亚洲棕合电彰| 国产精品无码av| 久久色一区二区| A片A5445444| 亚洲日韩AV视色| 亚欧美综合网| 九月丁香婷婷| 青草草免费网站av| 中文无线日韩一区| 九九色精品| 久久的免费性爱视频| 中文乱码99| 91碰碰| 国产精品免费视频不卡| 国产精品久久| 欧美中字不卡| 99热思思| 综合av社区| 久久久999国产| 午夜精品久久久99| 日逼国产| 精品九九| 极品人妻少妇综合| 1二区9| 一区二区日韩欧美久久| 日日操丁香五月天| 密乳视频在线| 国产黑白丝在线| 99RE在线视频精品,这里只有精品| 中文字幕aⅴ在线视频| 亚洲精品人体| 免费视频观看60秒| 天天操熟妇| 久草精品国产蜜臀| 伊人久久青青草| 色超碰综合| 免费看污网址| 欧美 青青草| 韩国黄色片精品久久久 | 国产亚洲精品农村妇女| 日本成人在线不卡一区二区三区| 亚洲揄拍网| 欧美色图成人网一区二区| 奸色色 男人天堂 天天射| 思思性爱| 思思热免费在线视频| 夜夜草我| 成人性爱av.com| 欧美 亚洲 在线| 国产又粗又长的视频| 激情在线青青操| 91精品久久久久久久久久| 中国的操老妇女| 日韩亚洲97| 加勒比五月天| 国产精品毛片| 91天美免费| 2020中文字幕在线观看| 精品国产Av无码久久久伦古装| 国产丰满熟夫69mpp| 9999亚洲精品| 久久久久国产精品喷潮免费观看臀| 中文久久爆乳| 91亚洲精品青草| 国产精品一级二级在线| 欧美九九99久久精品| 精吧天堂| A啊啊在线观看| 无码高清操逼| 老熟女91| 亚洲欧美在线观看2021| 天天日天天爽| av情色影音| 欧美 综合| 欧美激情亚洲情色| 亚洲图片小说欧洲| 九九综合九九综合| 能直接看AV的网站| 婷婷五月综合在线| 美女久久久久久久| 香蕉精品二区二区| 性在久久久久久| 国产视频三区四区| 久久精品99| 亚洲综合有码| 国产女人和拘做爰视频 | 欧美爱国产综合、| 日韩中文字幕视频| 欧美很很操视频| 日韩欧美大力操| 999狠狠综合| 97干综合网| 成年人黄色小视频网站| 九九热超碰97亚洲最新香蕉| 麻豆精品一区二区三区四区免费观看| 欧亚性爱啪啪| 人妻熟女一区二区| 性九九九九九九| 日韩欧美大力操| 九九夜精品九九在线| 91天堂| 99超碰色| 97视频播放| 一区二区不卡| 999久久芭蕾| 中文字幕成人| 大香蕉一人| 99精彩视频| 蜜臀久久99精品| 激情国产乱伦Av| 天天大干大香蕉| 日韩欧美亚欧在线视频| 亚卅熟女乱色| 熟女人妻一区二区三区免费看 | 亚州一区二区| 人人玩人人添人人澡免费| 青女在线| 欧美综合网| 国产噜噜噜噜噜久久久久久久久| 九九九不卡| 蜜桃久久综合视频| 91这里只有精品| 第二页中文字幕| 成年人性爱日韩| 九九热精品视频六| 91ise欧美| 男人高清无码一区二区| 囯产精品久久久久久久久久二区三区| 老熟女熟妇| 99色视频| 国产一级不卡在线观看| 日韩av情韩国爱禁区av一区二区| 精品免费一区二区三区在线亚洲人成| 一级性爱啪啪视频| 玖玖无码超碰| 一区二区三区日韩欧美 | 人人操人人插 - 百度 - 百度| 欧美精品 - 91爱爱| 日本精品成人无码| 久久精品久久久久久久久| 精品九九淫乱男| 99久久婷婷国产综合精品草原| 欧美呦呦性爱| 永久电影三级在线观看| 亚洲综合图色在线| 天天日天天屌天天操| 国产欧美日韩臀| 九色PORNY9l原创自拍| 四虎AV在线观看| 激情五月婷婷| 思思热久久成人| 国产综合网站在线播放 | 国产精品麻豆成人av| 97在线视频观看| 香港澳门日本三级网站| 99国产精品| 国产精品国产精品国产| 一区二区三区看视频| 国内一级精品| 国产捆绑一区| 国产精品国产亚洲区艳妇糸列| 伊人影院中文字幕| 九久9精品| 國產尤物AV尤物在線觀看| 九月丁香综合网| 亚洲无码com| 人妻无一区二区三区| 淫荡少妇免费| 久久香蕉综合一本到3atv| 精品久久久亚洲AV成人网站| 人妻久久久| 在线97在线| 人伦四五区| 国产粉嫩蜜臀av一区二区三区 | 久视频在线观看| 999 久久久| 日本色日夜干| 丰满岳乱妇一区二区三区| av资源在线观看少妇| 青娱乐 成人娱乐在线| 亚洲91综合| 日本孕妇一区二区视频操逼免费看| 91一区二区三区蜜桃| 欧亚性爱视频免费看| 久久久久久夜夜夜夜夜| 99热成人| 欧美国产有色电影| 国内操逼视频二区| 亚洲麻豆av一区二区| 欧美日韩激情无码专区| JULIA一区二区三区在线播放| 国产精品嫩草久久久久| 国产亚洲禁久一区二区 | 97久久精品国产| 欧美亚洲宗合色性图| 亚洲色图欧美一区二区不卡| 五月丁香综合啪啪| 极品AV网站在线观看| 亚洲欧美色图小说| 青青草天天亲夜夜操网| 999九九九九国产动| 日本精品五区| 婷婷激情五月天小说网| 禁止观看美女黄| 啊啊啊啊网站| 日韩人妻中文视频| 9999亚洲电影| 欧美中文字幕日韩在线| 精品区9| 亚洲在线a| 狠狠色色| 黄色视频特级毛片| 亚洲丝袜99| 日韩97视频!在线| 国产福利av精彩对白| 免费精品无码一级毛片牛牛影视| 91麻豆一二三区| 大鸡吧尹人在线| www.色操逼| 黑人综合网| 中文字幕熟女人妻丝袜丝| 国产精品久久久久久久久久久久久久久久久久| 毛片久久| 五月综合婷婷久久网站| 一区二区三区四区五区久久久久久| 黄色工厂这里只有精品| 国产色呦呦| 一本久道久久综合狠狠爱一密臀精 | 丁香五月影院| 97射欧美| 刺激性视频黄页| 人人贴人人摸| av日韩中文字幕| 日本一片一区| 婷婷五月天综合网| 爽极品影院| 久久久久久性爱片| 欧美国产精品久久九九| 二三四区精品| 丰满少妇一区二区三区专区| 国产精品嫩草久久久久| 中韩中文字幕在线观看| 中文字幕女同在线| 女色视频社区| 五月天激情四射| 亚洲国产一级精品毛一级精品看免费视频 | 国产探花日韩援交| 2019久久久久久久久福利| 91高潮| 狠狠97| 91青青在线视频| 超碰98综合网| 欧洲亚洲人妻无码中字久久三区四区| 日韩av免费一级电影| 亚洲本色精品一区二区久久| 久久精品操| 色香网| 天天性射网| 激情黄色五月天| 日日夜夜草草草| 人妻激情偷乱视频一区二区三区 | 亚洲一区二区中文字幕| 久久久久亚洲?V片无码V| 国产中文字幕在线点播| 九九热三级片| 亚洲精品97| AV一区观看| 97超碰色| 国产性爱在线视频一区二区| 久久中文字幕一区不卡| 久久久久久亚洲中文| 免费一级黄色录像影片| 在线国产福利网址导航| 国产一区二区三区高清视频| 色综合一本| 韩国一级AAA| 欧美激情综合| 人人手机欧洲亚洲国产人妻| 黄色不卡视频| 人妻少妇无码| 成人久久久精品| 91 偷| 九九精品无码专区免费| 无遮挡男女激烈动态图| 97亚洲欧美| 色哟哟 日韩精品| 九九九色| 国产精品自在线发布| 亚洲一卡2卡3卡4卡乱码网站| 日韩不卡毛片Av免费高清| 午夜高清成人在线视频| 福利在线黄片| 久久久草成人网站久久久草成人久久久草久久久 | 成人毛片免费| 婷婷深爱五月| 91九九九小逼| 欧美懂色综合网| 狠狠色狠狠色狠狠五月| 九九精品美女高溯喷水| 亚洲另类色综合网站| 亚洲一区日韩精品| 日韩偷拍色图| 哈哈操电影| 狠日操| 香蕉久久精品| 国产精品黑人一区二区三区| 9l视频自拍9l九色成人| 四虎免费视频| 人妻中文字幕日韩电影| 中文字日本乱码| 一区 欧美 日韩 麻豆| 欧美色图片| 粉嫩在线一区二区懂色| 日韩中文字幕熟妇人妻| 久久久久久九九九九九| 亚洲欧洲综合视频在线| 97精品中文字幕| 免费A片三p视频| 久久伊人网视频一区二区三区 | 亚洲 暴爽 AV人人爽日日碰| 色五月婷婷网| 亚洲天天更新| AV九九| 黑丝制服中文字幕| 美女自卫慰黄网站免费| 女同性恋中文字幕| 激情AV| 资源新线在线天堂| 99热免费| 久久精品国产Aⅴ| 乱理日韩中文| 国产400孕妇孕交群| 99久久这里只有精品| 强被迫伦姧在线观看无码网站| 91人妻丝袜无码| 成人区人妻精品一| 久久精品国产亚洲AV无码电影| 亚洲自拍青操视频| 国产福利在线视频网站| 91日产欧美| 国产精品久久久久综合| 亚洲情色综合| 裸体1区| 玖玖玖玖精品国产剧情| 自拍六区| 日本中文字幕一区| 免费无码国产精品v片在线观看| 91精品人妻啪啪间| 女人被男人桶爽视频网站| 亚洲欧美天| 欧美激情 一区| 人妻大相焦在线| 激情五月婷婷| 八人操人人摸人人看| 欧美性爱一区二区三区| 啊啊啊啊二区好大| 日韩丝袜二区| 欧美96在线|欧| 久久鲁夜| 91女神在线视频| 一区二区三区 日韩欧美| 97色碰| 热久久无毒不卡| 久久久婷| 色大师网站www永久网站视频| 色99色| 99爱精品| 五月丁香在线| 又黄又爽在线观看视频| 波多野42部无码喷潮在线观看| 在线人人人人人人精品超| 17c嫩草51久久91嫩草| 精品国产乱码久久久影院| 极品色电影院| 蜜臀无码一区二区| 操人妻少妇中文| 97国产精品国| 亚洲美欧999| 欧美激情视频一区二区三区不卡| 日韩有码免费视频| 裸体美女国产免费久久久网站| 99视频只有精品| 婷婷色香| 熟女网站最新|