久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

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

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

Effective C++精讀:語言聯(lián)邦、const與初始化實(shí)戰(zhàn) 我很久沒翻開那本橘黃色封面的 C 經(jīng)典了但每當(dāng)身邊有朋友問“C 到底應(yīng)該怎么學(xué)”我總會(huì)提起這本書里的第一章節(jié)“讓自己習(xí)慣 C”。作為 Effective C 55 個(gè)具體做法的開篇這一章只有四個(gè)條款卻奠定了整本書的方法論基礎(chǔ)。這些年我見過太多人把 C 當(dāng)成一門“帶類的 C”來寫結(jié)果代碼越寫越別扭問題越查越深也有人一上來就扎進(jìn)模板元編程連基本對(duì)象生命周期都沒捋清。這篇摘錄想做的就是把第一章的四個(gè)條款掰開揉碎結(jié)合我實(shí)際工程里的經(jīng)驗(yàn)講講每一條規(guī)則背后的“為什么”和落地時(shí)的注意點(diǎn)。如果你正準(zhǔn)備系統(tǒng)地讀 Effective C或者已經(jīng)讀過但覺得某些條款沒吃透這篇文章可以當(dāng)作一份帶注釋的閱讀筆記。書里每個(gè)條款讀起來都很短但每一條都能展開成一篇長(zhǎng)文我會(huì)盡量用具體代碼和場(chǎng)景把它們講透。1. 航拍視角先認(rèn)清 C 是一個(gè)語言聯(lián)邦而不是一門單一語言1.1 為什么很多人學(xué) C 越學(xué)越混亂原書作者在條款 01 里提出了一個(gè)非常經(jīng)典的觀點(diǎn)C 不是一門單一語言而是由四個(gè)次語言組成的“語言聯(lián)邦”。這四個(gè)次語言分別是C、面向?qū)ο蟮?C、模板 C泛型編程、以及 STL。我第一次讀到這個(gè)說法時(shí)覺得太抽象了但工作幾年后回頭再看這可能是全書最值得反復(fù)咀嚼的一句話。很多人覺得 C 難學(xué)本質(zhì)上是因?yàn)檫@四個(gè)次語言的使用方式、編程范式、慣用法差別太大。用純 C 的思路寫 C你會(huì)覺得類、命名空間、異常都是多余的負(fù)擔(dān)用面向?qū)ο蟮乃悸酚蔡姿袌?chǎng)景你會(huì)覺得模板和算法庫與你格格不入反過來如果你一上來就只用模板元編程那一套又會(huì)把簡(jiǎn)單的業(yè)務(wù)邏輯寫得晦澀難懂。問題不在于你選錯(cuò)了某一個(gè)范式而在于你沒有意識(shí)到C 允許你在不同場(chǎng)景下切換到不同范式關(guān)鍵是要知道“現(xiàn)在正站在哪塊領(lǐng)土上”。1.2 四個(gè)次語言分別對(duì)應(yīng)什么樣的編程策略我在讀這個(gè)條款時(shí)給自己畫了一張“心智地圖”這幾年一直在用可以分享給你次語言核心特征典型場(chǎng)景你的思考方式C無類、無模板、無異常面向過程底層模塊、嵌入式、系統(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)、泛型抽象容器、算法、類型安全的工具庫類型層面的復(fù)用、編譯期行為STL容器、迭代器、算法、函數(shù)對(duì)象日常數(shù)據(jù)結(jié)構(gòu)和算法使用迭代器、算法復(fù)雜度、容器的選擇舉個(gè)例子寫嵌入式驅(qū)動(dòng)時(shí)我基本在用次語言 C 的方式結(jié)構(gòu)體、位運(yùn)算、函數(shù)指針寫一個(gè)大型業(yè)務(wù)系統(tǒng)時(shí)我切換到面向?qū)ο蟮拇握Z言抽象基類、虛函數(shù)、工廠模式寫一個(gè)通用緩存組件時(shí)我可能大量使用模板和 traits處理一批數(shù)據(jù)時(shí)我直接用 STL 的 vector、sort、find_if。規(guī)則很簡(jiǎn)單當(dāng)遵循某一子語言的規(guī)約時(shí)你就只在這個(gè)子語言的框架內(nèi)思考這樣能顯著降低認(rèn)知負(fù)擔(dān)。條款 01 還提醒了一個(gè)很實(shí)用的點(diǎn)不同次語言的“高效編程守則”不同取決于你用哪種風(fēng)格編程。比如在傳統(tǒng)的 C 部分值傳遞通常沒問題但在面向?qū)ο蟮?C 里值傳遞意味著拷貝構(gòu)造和析構(gòu)的額外開銷常量引用往往更合適而在模板代碼里你又得考慮引用折疊和完美轉(zhuǎn)發(fā)。很多人寫 C 代碼“哪里都別扭”往往不是因?yàn)檎Z法不熟而是因?yàn)闆]有意識(shí)到自己在混合使用多個(gè)子語言卻沒有切換對(duì)應(yīng)的策略。1.3 用這個(gè)視角重新審視你手頭的代碼讀完這個(gè)條款后我做了一次自查把最近一年寫的某個(gè)模塊按四個(gè)次語言分類發(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)地操作”雖然能編譯通過但設(shè)計(jì)上確實(shí)不夠干凈。條款 01 本身沒有任何代碼示例也不涉及具體語法但它給了你一個(gè)判斷標(biāo)準(zhǔn)當(dāng)你寫某段代碼覺得“別扭”時(shí)先問自己四個(gè)問題——我在用哪個(gè)次語言寫這個(gè)次語言的標(biāo)準(zhǔn)做法是什么我是不是把另一個(gè)次語言的規(guī)則帶過來了能不能換一種寫法這四個(gè)問題我在 Code Review 時(shí)也經(jīng)常用來反問別人比直接改代碼有效得多。2. 從預(yù)處理時(shí)代到編譯器時(shí)代const、enum、inline 如何替換 #define2.1 #define 的三個(gè)典型隱患條款 02 是“盡量以 const、enum、inline 替換 #define”這一條表面上是說風(fēng)格實(shí)際上是講“不要依賴預(yù)處理器做語言本身該做的事”。我剛?cè)胄袝r(shí)特別喜歡用宏定義常量用 #define寫小工具函數(shù)用 #define覺得簡(jiǎn)單粗暴。后來在項(xiàng)目里吃過虧才明白宏的三大隱患。第一宏不進(jìn)入符號(hào)表出了編譯錯(cuò)誤你看到的只有數(shù)字。比如你寫了 #define N 42編譯器報(bào)錯(cuò)信息里只顯示 42不會(huì)提示你 N 是什么排查起來全靠記憶。第二宏沒有類型檢查。你在一個(gè)需要 double 的地方使用了 int 宏常量編譯器不會(huì)給出任何警告一旦協(xié)議格式變化或者數(shù)據(jù)類型升級(jí)問題就埋在深處。第三宏在預(yù)處理階段替換展開后的副作用很難預(yù)測(cè)尤其是帶參數(shù)的宏比如 #define SQUARE(x) x * x調(diào)用 SQUARE(1 2) 會(huì)展開成 1 2 * 1 2結(jié)果出乎所有人意料。2.2 常量替換的具體做法和場(chǎng)景選擇原書給出的替代方案很明確對(duì)于常量?jī)?yōu)先用 const 常量替代 #define如果要在 class 內(nèi)定義一個(gè)常量且希望它是編譯期整數(shù)常量可以用 enum 來實(shí)現(xiàn)“類似宏”的效果對(duì)于函數(shù)宏用 inline 函數(shù)替代。先看最常用的 const 場(chǎng)景。假設(shè)你需要定義一個(gè)全局常量// 原來的寫法 #define MAX_CONNECTIONS 1024 // 替換后的寫法 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)目里特別重要。我見過好幾個(gè)項(xiàng)目頭文件里直接寫 const std::string kAppName xxx;結(jié)果每個(gè)包含這個(gè)頭文件的編譯單元都實(shí)例化了一份 std::string白白增加了二進(jìn)制體積。用 extern 聲明、在 cpp 中定義是更好的做法。再看 class 內(nèi)的常量。如果常量只在類內(nèi)使用而且你想讓它在類內(nèi)“可見”C11 之前有一種常見寫法class GamePlayer { private: static const int NumTurns 5; // 常量聲明 int scores[NumTurns]; // 用它來聲明數(shù)組 };這種寫法依賴“類內(nèi)初始化器”和“編譯期常量”的結(jié)合。C11 之后static constexpr 更推薦比如 static constexpr int NumTurns 5;語義更明確。但這里有一個(gè)“歷史遺留坑”如果你只是聲明了 static const int NumTurns 而沒有在類外定義取它的地址例如 int* p NumTurns;時(shí)某些編譯器會(huì)報(bào)鏈接錯(cuò)誤因?yàn)槿鄙俣x。解決方法是類外補(bǔ)一行 const int GamePlayer::NumTurns;而 enum 不存在這個(gè)問題——enum 沒有地址的概念。這就是條款 02 提到的 enum hack當(dāng)你想在類內(nèi)聲明一個(gè)編譯期整數(shù)常量又不想讓它變成可被取地址的對(duì)象時(shí)enum 是一個(gè)非常合適的工具class GamePlayer { private: enum { NumTurns 5 }; int scores[NumTurns]; };enum 的意義在于它既是編譯期常量又有類型約束而且不能被取地址也沒有鏈接問題。在工作中如果你寫的是老代碼風(fēng)格的項(xiàng)目enum hack 依然能解決實(shí)際問題如果你用的是 C17 及以后的標(biāo)準(zhǔn)static constexpr 通常更優(yōu)雅但理解 enum hack 背后的動(dòng)機(jī)依然重要因?yàn)樗谀0逶幊汤餆o處不在。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)生問題。我實(shí)際踩過一次傳了一個(gè) map.find() 的返回值宏內(nèi)部把它比較了兩次、取用了三次迭代器狀態(tài)直接亂掉。inline 函數(shù)可以完美解決這個(gè)問題。把宏改成普通函數(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)是宏無法做到的宏沒有類型概念不會(huì)幫你做拷貝優(yōu)化也不理解引用語義。在熱路徑上inline 函數(shù)有機(jī)會(huì)被內(nèi)聯(lián)展開性能上與宏接近但可調(diào)試性和可讀性完勝。我自己的心得是不要試圖“完全消滅宏”而是要弄懂宏能做什么、不能做什么。配置文件里的版本號(hào)、條件編譯開關(guān)、以及那些必須依賴預(yù)處理指令才能實(shí)現(xiàn)的功能宏依然是唯一選擇但凡是“語言層面能表達(dá)的東西”優(yōu)先用語言特性。這條邏輯直到今天依然成立。3. const 的多重身份指針、容器、函數(shù)返回值與成員函數(shù)3.1 指針和迭代器上的 const位置決定含義條款 03 的主題是“盡可能使用 const”。這一條看起來簡(jiǎn)單實(shí)際是 C 里最容易出 bug 的語法點(diǎn)之一尤其是 const 加在指針的哪個(gè)位置含義完全不同。char greeting[] hello; char* p greeting; // 非 const 指針非 const 數(shù)據(jù) const char* p2 greeting; // 非 const 指針const 數(shù)據(jù) char* const p3 greeting; // const 指針非 const 數(shù)據(jù) const char* const p4 greeting; // const 指針const 數(shù)據(jù)判斷方法很簡(jiǎn)單看 const 修飾的是誰。const 在星號(hào)左邊修飾的是“被指向的數(shù)據(jù)”const 在星號(hào)右邊修飾的是“指針本身”。這里的“數(shù)據(jù)”到底是字符串還是對(duì)象在數(shù)組和指針場(chǎng)景中表現(xiàn)得特別明顯。我經(jīng)常在 Code Review 里看到有人把只讀的字符串參數(shù)寫成 char*結(jié)果旁邊還掛著一堆 const 警告。改成 const char* 或 const std::string函數(shù)體里再也不會(huì)有人試圖修改傳入內(nèi)容。STL 迭代器也有同樣的規(guī)則。const_iterator 相當(dāng)于 const 數(shù)據(jù)的指針?biāo)赶虻娜萜髟夭荒芡ㄟ^該迭代器修改但迭代器本身可以移動(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 迭代器用法上像指針語義上也分“指向的東西”和“自身”。把 const 用對(duì)位置能直接消除一整類編譯期問題。3.2 函數(shù)返回值加 const防止語義被誤用const 不僅可以用在參數(shù)和變量上還可以修飾函數(shù)返回值。原書舉的例子是重載運(yùn)算符。像 operator* 返回 const Rational能防止用戶寫出 (a * b) c 這種荒謬的代碼。這個(gè)例子放在今天某些人眼里會(huì)覺得小題大做但它背后的問題在自定義類型里非常常見。我自己遇到過類似的場(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í)慣能擋住很多無意識(shí)的破壞。另一個(gè)容易忽略的角度是const 返回值還能讓臨時(shí)對(duì)象讀起來更安全。比如 operator 返回 const 對(duì)象時(shí)臨時(shí)對(duì)象的生命周期不會(huì)變長(zhǎng)但它阻止了對(duì)臨時(shí)對(duì)象的修改。雖然 C11 移動(dòng)語義讓某些“返回 const 對(duì)象會(huì)阻礙移動(dòng)”的問題浮現(xiàn)出來但具體問題還要具體看如果返回值是自己封裝的小對(duì)象且沒有移動(dòng)需求const 返回值依然是合理選擇。3.3 const 成員函數(shù)接口的“讀寫權(quán)限聲明”條款 03 后半段討論了 const 成員函數(shù)這是很多初學(xué)者最陌生、但實(shí)際項(xiàng)目中最常見的設(shè)計(jì)手段。給成員函數(shù)加上 const等于告訴調(diào)用方“這個(gè)函數(shù)不會(huì)修改對(duì)象的邏輯狀態(tài)”。好處有兩點(diǎn)一是從接口層面直接區(qū)分“讀”和“寫”使用者一看便知二是 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é)果。如果沒有 mutableconst 成員函數(shù)里就寫不了這種代碼。注意mutable 只能修飾成員變量不能修飾局部變量它是對(duì) const 成員函數(shù)“內(nèi)部可變性”的一種精確放行。還有一個(gè)經(jīng)常被寫錯(cuò)的地方const 版本和非 const 版本的成員函數(shù)可以重載但實(shí)現(xiàn)時(shí)要注意避免代碼重復(fù)。原書給的技巧是“非 const 版本調(diào)用 const 版本”利用 const_cast 去掉返回值的 const 限制。我在實(shí)際項(xiàng)目中一般會(huì)反過來思考先把邏輯都放進(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ì)象本來是真正的 const 對(duì)象修改它就是未定義行為。所以 const_cast 只能用在“你知道對(duì)象本身不是 const”的場(chǎng)景里比如先查緩存、再返回可變引用這種經(jīng)典寫法而不是用來繞過 const 檢查。4. 初始化不是賦值對(duì)象使用前的“四大坑”與解決套路4.1 為什么 C 的初始化規(guī)則總把人繞暈條款 04 是“確定對(duì)象被使用前已被初始化”這大概是第一章里實(shí)際踩坑最多的一條。C 的初始化問題非常擰巴有的變量不初始化就是垃圾值有的類成員的默認(rèn)構(gòu)造會(huì)自動(dòng)初始化有的類型比如內(nèi)置類型在你聲明時(shí)不給你任何默認(rèn)值。我剛工作那年就吃過虧一個(gè)局部 bool 變量沒初始化剛好是 true程序走錯(cuò)了分支排查了一下午。這里要分清兩個(gè)概念初始化和賦值。初始化是“對(duì)象一生下來就有值”賦值是“先有對(duì)象再把值放進(jìn)去”。對(duì)于內(nèi)置類型這兩者在形式上看起來一樣但對(duì)于類類型初始化調(diào)用的是構(gòu)造函數(shù)賦值調(diào)用的是 operator語義完全不同。用成員初始化列表就是初始化在構(gòu)造函數(shù)體內(nèi)賦值則是“先默認(rèn)構(gòu)造再賦值”后者多了一次無意義的默認(rèn)構(gòu)造開銷有時(shí)還會(huì)導(dǎo)致不可預(yù)期的行為比如引用成員根本不能賦值。我對(duì)這條規(guī)則的執(zhí)行標(biāo)準(zhǔn)很簡(jiǎn)單所有內(nèi)置類型成員、指針成員一律在聲明處初始化或構(gòu)造函數(shù)初始化列表中顯式初始化所有類類型成員能用初始化列表就用初始化列表。哪怕你覺得“反正默認(rèn)構(gòu)造也是空的賦不賦值都一樣”也要把初始化列表寫出來因?yàn)榇a的可維護(hù)性來自“一眼能看出這個(gè)成員的值從哪里來”而不是靠推理。4.2 初始化列表與成員聲明順序的“隱形炸彈”用初始化列表時(shí)有一個(gè)特別隱蔽的規(guī)則成員的初始化順序只由它們?cè)陬愔械穆暶黜樞驔Q定與初始化列表的書寫順序無關(guān)。也就是說即使你在初始化列表里把 y 寫在 x 前面如果類中先聲明 x實(shí)際仍然是先初始化 x再初始化 y。這個(gè)坑在“用別的成員初始化當(dāng)前成員”時(shí)特別致命。例如class Point { public: Point() : y(2), x(y) {} // 看起來 y 先初始化其實(shí)還是 x 先初始化 private: int x; int y; };實(shí)際運(yùn)行時(shí)x 先初始化而 x 的初始化用的是 y 的當(dāng)前值——此時(shí) y 還沒初始化是個(gè)垃圾值。于是 x 得到一個(gè)隨機(jī)數(shù)而不是預(yù)想的 2。這個(gè) bug 編譯器通常不會(huì)警告只有開了 -Wreorder 之類的選項(xiàng)或者運(yùn)行時(shí)輸出異常才會(huì)發(fā)現(xiàn)。我的建議是把初始化列表的書寫順序永遠(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ì)象初始化次序問題經(jīng)典中的經(jīng)典條款 04 最后討論了一個(gè)更宏觀的問題不同編譯單元里定義的 static 對(duì)象的初始化次序是不確定的。這里的 static 對(duì)象包括全局對(duì)象、namespace 作用域的對(duì)象、類里的 static 對(duì)象、函數(shù)里的 static 對(duì)象以及文件作用域的 static 對(duì)象。當(dāng)一個(gè) static 對(duì)象的初始化依賴另一個(gè)編譯單元中的 static 對(duì)象時(shí)你無法保證前者初始化時(shí)后者已經(jīng)初始化完畢。假設(shè) A.cpp 里有一個(gè)全局配置對(duì)象 ConfigManagerB.cpp 里有一個(gè)注冊(cè)表 RegistryRegistry 的構(gòu)造函數(shù)里要用 ConfigManager 去讀取配置。兩個(gè)文件誰先初始化、誰后初始化完全由鏈接順序和編譯器實(shí)現(xiàn)決定沒有任何標(biāo)準(zhǔn)保證。運(yùn)行起來可能這次正常、下次崩換個(gè)編譯器直接掛在啟動(dòng)階段。原書給出的解法我一直在用把“非局部 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)問題。我在一個(gè)后臺(tái)服務(wù)里用這個(gè)方式管理配置、日志、連接池等組件啟動(dòng)順序問題從根上消失了。這個(gè)技巧也有需要注意的地方如果兩個(gè)函數(shù)的初始化存在循環(huán)依賴A 初始化時(shí)需要 BB 初始化時(shí)需要 A這個(gè)方案同樣救不了你只能靠重構(gòu)拆解依賴。另外在 C11 之前的老編譯器上函數(shù)內(nèi) static 初始化的線程安全問題需要自己加鎖不過現(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è)次語言”做 Code Review 的前置分類讀完條款 01 后我形成了一套自己的 Code Review 流程先看這段代碼屬于哪個(gè)次語言再用對(duì)應(yīng)次語言的標(biāo)準(zhǔn)去評(píng)價(jià)。比如一個(gè)用 STL 算法實(shí)現(xiàn)的過濾邏輯我會(huì)關(guān)注迭代器用法、算法復(fù)雜度、是否能用 lambda 簡(jiǎn)化一個(gè)用面向?qū)ο箫L(fēng)格設(shè)計(jì)的類我會(huì)關(guān)注接口設(shè)計(jì)、const 正確性、是否違反開閉原則一個(gè)模板工具函數(shù)我會(huì)關(guān)注類型推導(dǎo)、引用折疊、是否需要 SFINAE 或概念約束。這種分類思維能讓你在面對(duì)“這代碼寫得好不好”時(shí)給出一個(gè)更精準(zhǔn)的答案而不是籠統(tǒng)地說“感覺不太優(yōu)雅”。C 的“好”永遠(yuǎn)是相對(duì)的同一段代碼放在 C 風(fēng)格模塊里可能不倫不類放在模板庫的擴(kuò)展里可能恰到好處。5.2 const 正確性是“傳染性”的早加比晚加便宜得多const 正確性有一個(gè)特點(diǎn)它像一種會(huì)“傳染”的屬性。一個(gè)沒有 const 的函數(shù)調(diào)用另一個(gè)函數(shù)時(shí)如果后者是 const 成員函數(shù)前者可以安全調(diào)用但如果一個(gè) const 對(duì)象調(diào)用了非 const 成員函數(shù)編譯器直接報(bào)錯(cuò)。所以 const 加得越早后面其他代碼就越容易保持 const 安全等代碼寫完了再補(bǔ) const往往是一串連鎖修改。我建議新寫的接口所有參數(shù)能加 const 引用的都加所有不修改內(nèi)部狀態(tài)的成員函數(shù)都標(biāo) const。你可以不加 const 也能編譯通過但加了 const 之后編譯器會(huì)強(qiáng)制你維護(hù)這個(gè)承諾長(zhǎng)期看能擋掉很多無意的修改。這里的額外價(jià)值是當(dāng)別的函數(shù)需要一個(gè) const 對(duì)象時(shí)你的類已經(jīng)準(zhǔn)備好了。5.3 初始化順序問題編譯器不是你的朋友而是你的敵人我最后想強(qiáng)調(diào)的還是初始化。每次看到有人自信地說“對(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ù)的初始化列表中明確寫出。不依賴“默認(rèn)值”不依賴“某個(gè)函數(shù)會(huì)幫我填”不依賴“運(yùn)氣”。這個(gè)習(xí)慣比任何靜態(tài)檢查工具都有效因?yàn)樗鼜脑搭^消除了未定義狀態(tài)。6. 讀這一章時(shí)我踩過的幾個(gè)坑最后聊點(diǎn)個(gè)人體會(huì)。我第一次讀條款 02 時(shí)覺得自己早就知道 const、enum、inline 的用法沒必要逐條看。結(jié)果沒過多久就在實(shí)際項(xiàng)目中犯了一個(gè)教科書級(jí)的錯(cuò)誤我在頭文件里寫了 #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)。開發(fā)環(huán)境一切正常發(fā)布到線上偶發(fā)崩潰。后來查了幾天發(fā)現(xiàn)問題就是跨編譯單元的 static 初始化順序不確定。用局部 static 函數(shù)替換全局對(duì)象后問題徹底消失。這個(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ā)寫。實(shí)際工程里要么用 std::call_once 或 std::mutex 保護(hù)緩存邏輯要么干脆在文檔里注明這個(gè)類不是線程安全的。我后來給自己定了一個(gè)原則mutable 只能用于“線程邊界明確”的場(chǎng)景否則寧可放棄緩存也不引入數(shù)據(jù)競(jìng)爭(zhēng)。如果你正要開始讀 Effective C 或者已經(jīng)讀到后面幾章我建議你時(shí)不時(shí)回到第一章看一眼。這不是溫故知新而是這一章講的是“思維方式”而不是“語法糖”。等你真正把“語言聯(lián)邦”“用編譯器替預(yù)處理器”“盡可能 const”“先初始化再使用”這四條刻進(jìn)寫代碼的本能里后面 51 個(gè)條款讀起來會(huì)順很多。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
人人操人人色网| 少妇熟女视频一二三区| 天天看片麻豆| 偷拍 欧美 日韩| 国产一级做a爰大片免费久久| 东亚亚洲无码高清| 国产白领连续中出在线观看| 欧州91高潮| 国产亚洲色婷婷久久99精品91葵花宝典 | 激情文学小说一区二区 | 这里有精品| 亚洲无码成人精品| 日韩精品一二三四| 黑人综合网| www.夜夜操| 超碰一区二区| 国产一区二区在线电影| 日本欧美m v精品网站加| 日本一区不卡| 91校园春色长篇| 99热线麻豆| 岛国视频免费在线观看| 亚洲黄a三级三级三级看三级| 超碰97人妻免费在线| 久热无码| 啊灬啊灬啊灬啊灬高潮奶出了免费视 | 美女好片色日本| 欧美成人黄网色网站| 亚洲综合夜色| 天天日美女的B| 91亚州欧美| 丁香激情网| 亚洲Av噜噜一区二区三区妖精| 亚欧国产无码精品在线| 女性喷水高潮在线观看| 丁香激情网| 婷婷伊人五月| 综合欧美日韩在线观看| 99日免费视频中文字幕| 99热18| 91中文字幕制服丝袜免费视频| 熟女突然公开看18禁影片| 欧美亚洲高清晰| 中国探花熟女| 99操逼| 青青国产精品在线| 一个色导综合| 精品国产乱码久久久久久免费| 91精品国产高清久久久久久,亚洲成人 | 一区二区三区日韩欧美| 蜜臀久久99精品久久久老,,| 欧美高清18A片| 国产偷人妻精品一区二区在线| 亚洲AV秘 精品久久老牛影视| 日日干夜夜欢| 青青操97| 青草视频在线看看看看看看看看看| a级免费在线观看| 熟女在线视频| 国产成人精品日本视频| 天天插网| 1204人成网站色www| 337p大胆噜噜噜噜噜91Av| 夜夜骑日日| 国产欧美日韩精品中文| 国产青青综合伊人| 好爽,再快点啊哈嗯嗯嗯嗯| 青青免费在线视频一区| 欧美色图99| 亚洲情色婷婷五月天| 内射夫妻三片| 天天干夜夜操一区二区| 日本三级日本三级三级人妇四虎| 国产一级特黄大片处女| 无码精品久久久久久亚洲| 中文字幕第23区| 久操婷婷| 久久久久久久国产a∨| 欧美激情专区| 啊啊啊啊啊啊在线观看| 中文三一区| 熟妇一区二区三区| 激情看片网站| 黄色免费网页无码| 天堂性色| 91天天美女| 青青网三级视频| 中文AV制服乱伦| 91激情综合| 91欧美偷拍| 精品视频久久久久九九九九9999 | 亚洲成a人在线观看久| 2018天天日天天日| 97超碰超碰| 超碰碰小说97| 国产精品视频| 大香蕉伊利av| 婷婷亚洲综合| 欧美性五月| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 蜜臀aV午夜一区二区三区| 免费的黄片wwwwww| 国产家庭乱伦表演| 91色综合| 久久97精品久久久久久久不卡| 国产精品久久久久久久久久久久久久久久| 日韩精品人妻系列无码天堂| 91挑色欧美| 超碰在线日韩一区| 岛国在线一区二区三区| 国产精品麻豆成人av| 久久人| 精品人妻一区二区蜜桃视频| 日韩久草| 色色综合97| 久久一二三四五六七八九区区| 欧亚综合一卡二卡中文字幕| 老女人爆菊| 伊人热综合| 精品人妻一区二区三区-国产| 免费在线观看国内色片网站网址| 奇米狠999| 国产一级137片内射麻豆| 亚欧免费观看视频| 婷婷色色五月天福利| 日韩本不卡视频在线观看| 超碰在线在公开超碰在线在公开| 亚洲男人天堂2| 欧美日动态视频| 大香蕉啪啪啪啪在线| 蜜臀99999| 久久黄黄| 亚洲人成色9999精品久久 | 天天天天天干夜夜夜夜夜操| 爱爱60秒免费视频| 91蜜臀在线久久久久| 看看小穴| 亚洲熟妇乱女区二区三区| 上床啊啊啊| 久久女婷| 五月婷婷丁香| 一区二区三区四区久久视1| 91在线综合网| 精品国产乱码久久久久久日本公司| 97视频新免费| 亚洲熟女人妻中文字幕一区二区| AV麻豆免费一区| 性久久| 韩国一级婬片A片AAAAA| 黑丝少妇在线观看| 97精品久久久久久久| 91路www| 亚洲天堂一二| 性爱网站一区二区| 影视综合无码少妇| 日日操天天操| 久久久久七视频| 91超碰在线播放| 九九九国产| 国产9熟妇视频网站| 精品无吗m| 日韩中文字幕精品一区在线| 黄页大片在线观看| 亚洲高清欧美总合| 久久狠狠色噜噜狠狠狠狠97| 九月丁香婷婷色| 亚洲av乱伦色图网站| 日本亚洲vr欧美不卡高清专区| 欧美精品双插| 中文字幕美女91| 国产AV超爽| 色播综合| 欧美天堂亚洲电影院一区在线播放| 天天超级碰碰碰| 男女国产精品| 日韩av不卡在线观看| 久久久一热在线播放| 91AV天美在线视频| 视频一区二区三区精品| 99操99| 国产精品在线网站| 九九九九精品| 婷婷97| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 欧美激情内射| 天天视频综合在线观看视频| 日韩伦理久 久久 清纯| 精品九区| 免费一级毛片在线视频观看| 青青草国产一区二区三区| 成人蜜乳小视频网站| 国产三级多多影院2022国产AA一级毛片无码| 精品一区二区三区蜜桃臀赵总| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 玖玖草久草99蜜月一区二区三区| 亚洲一区二区在线观看91| 国产精品宅男免费| 精品女人999| 九九热精彩视频| 国产白丝av| 91一区二区| 欧美色91| 91色婷婷综合久久中文字幕二区| 九九综合网| 人人操人人摸人人看人人插| 午夜天堂网| 麻豆精品一区二区三区四区免费观看| 久久怡红院| 0755午夜福利视频| 亚洲欧洲另类| 天堂亚洲精品| 深夜激情无码| 热热色AV| 无码精品一区二区三区潘金莲| www.久久最新地址| 2019天天操天天爽天天拍| 97欧美色资源| 99热一区二区三区四区| 天天干,夜夜爽| 亚洲天堂第一页| 97爱亚洲| 婷婷综合在线| 97九色| 波多野结衣之双飞调教在线播放| 啊啊啊好爽快点啊啊啊嗯嗯| 亚洲精品一卡二卡三卡福利视频网站| 精品国产Av无码久久久亚洲| 91亚洲最新在线| 九九热精品| 国产精品成人午夜福利| 在线观看一卡二卡| 在线毛片片免费观看| 骚乳在线| 岛国片国产成人亚洲播放| 91强在线播放| 热久久无毒不卡| 婷婷丁香五月天综合东京热| 天天影视综合色| 国产后入精品| 女同女同恋久久级三级| 98超碰欧美| 狠狠 91| CCYY草草影院地址入口| 青久久| 秋霞久久亚洲精品成人| 亚洲97网站| 99热免费| 天天躁日日躁成人字幕aⅴ| 久久m| 强奸乱伦av电影| 欧美亚洲手机在线| 牛牛久久国产精品视频一二三| 国产熟女完整版中字| 欧美97av| 四虎AV无码| AAAAAAAAA黄片| 久啪视频| 中文在线久久字幕| 欧美日韩999| 91av熟女人妻| 久久精品操| 色综合潮| 能看的AV| 欧美成人午夜免费福利785| 人人操人人肉久久精品| 久久影视二区三区行押| 啊嗯好大视频在线观看| 欧美日韩操逼嗦吊| 美女视频尤物网在线看| 欧美 亚洲 在线| 亚洲视频,小说| 抽插无码高清一区| 成人无码在线超碰网| 国产白丝网站| 欧亚揄拍偷拍精品视频| 伊人97色天使| 日日干夜夜欢| 欧美日韩亚洲五月天婷婷| 日本污ww视频网站| 熟女这里只有精品6| 自拍啪啪视频| 五月开心久久AV官网| 中亚av| 国产一区二区在线电影| 超碰色男人操熟女| www.狠狠干.coom | 伊人久久久日韩一区| 无码少妇精品一区二区60岁老人| 小日子操bb在线看| 97日韩超碰超碰中文字幕| 欧美无圣光在线| 不卡一区二区日本视频| 日本成熟少妇A∨网站| 91精品91久久久久77777| 性交一区二区在线播放| 色哟哟-国产专区| 久久草在线综合视频| 九九久久国产精品| av激情亚洲五月天| 精品在线蜜臀| 亚州男人天堂| 久久久久久久性爱| 91人人| 青娱乐 青青青操 日逼| 欧美人妻一区二区| 性生活无遮挡纯毛片在线看| 欧亚日韩三区| 亚洲熟女乱综合一区二区三区| 久久97资源 网| 中文字幕少妇色| 亚洲不卡av在线| 精品国产网站| 国产盗摄美女如厕大神作品在线观看| 欧美一区二区情色| 性性久久| 91色伦| 黄色av播放免不| 亚洲影视高清第一页| 天美麻豆黄色录像| 亚洲天堂男人天堂网| 天天爱天天操| 色99999| 成人26uuu| 天天爽夜夜爽夜夜爽精| 美女尤物人人操| 国产亚洲中文不卡二区| 久久久精品视频免费观看| 欧美日韩在线国产在线| 亚洲国产无码精品首页久久久| 亚洲第一在线视频| 一区二区三区精品黑丝白丝酒店对鸡 | 亚洲色图A| 91老熟女| 手机在线中文字幕国产| 色色色综合| 密臀在线免费观看| 99日视频在线免费| 成人性爱免费播放| 亚洲成人av电影在线| 干b在线性社区| av麻豆啪啪| 91大胆欧美| 丰满的三级少妇欧美久久久| 女人 A一级| 老鸭窝亚洲毛片| 好好的日:com久久九九| 少妇内射视频| 粉嫩av一区二区三区天美传媒| 性色亚洲| 久久久久婷婷| 国产AV天美| 亚洲有薄码区久久在线一区| 肏逼视频日本| 国产 码在线成人网站| 五月丁香啪| 国产农村一一级特黄毛片| 粉嫩不卡一区二区性爱| 激情五月天色播| 91久久国产综合精品| 大茄子熟女AV导航| 国产精品人人爽人人做可爱福利 | 大香蕉在线免| 久久久久女教师免费一区| 国内精品嫩模A∨私拍小视频| 天天色综亚洲91污| 日本不卡二三区| 天天欧美97| 自拍偷拍国产欧美日韩韩| 亚洲欧美日韩综合在线尤物 | 欧美视频中文字幕区| 色好看av| 日本大香蕉综合网| 99日精品欧美国产| 西西美女视频网| 男人的天堂久久久| 日韩精品一区二区三区色欲| 白丝少妇一区二区| 人人干黄色| 99这里只有精品| av线电影| 在线观看亚洲专区| 久久99精品国产| 性夜影院爽黄A爽免费动漫| 色色色天美视频| 色 婷97| 色婷婷一区二区三区久久| 日本肏逼视频在线观看| 91高潮喷水美女| 三男一女不戴套的A片| 欧美日韩国内不卡| 加勒比色综合| 欧美人与性动交a美精品| 日韩少妇丰满亚洲| 无码区蜜乳| 欧美se亚洲| 日本影视久久免费| 泰国AV在线观看| 国语精品对白| 操操AV电影| 91n处女在线观看| 四虎影院成年人片| 久超碰这里只有精品| 综合久久六月久久婷婷| 欧美淫乱视频| www.人人cao| 国产欧美日产一区二区三区 - 国产欧美日 | 日韩精品99久久久久久中文字幕 | 国产十八禁视频| 18禁中文字幕| 蜜臀在线看片| 深爱激情五月天| 精品97久久| 五月婷婷深深爱| 啊啊啊啊啊啊在线观看| 91AV老熟女视频| 国产品精品自在在线午夜免费 | 欧美日韩*字幕一区| 九一亚洲国产免费| 1级黄色夫妻对换性交免费看| 日韩激情视频| 亚洲综合精品国产一区| 91大香蕉伊人| 精品妇女一区二区三区| a片久久久久久久久久久久| 欧洲中文字幕| 久久成人国产| 亚洲丝袜二区在线| 亚洲精品一二三四区| 日本一区二区三区免费观看| 伊人四虎综合| 日韩人妻少妇 一区二区三区| 精品少妇高潮久久| 少妇 综合| 国产一区二区三区白丝| 91青青在线视频| 欧美自拍偷拍免费观看| 青青草女人天天干| 91日日| 国产精品老熟女一区二区| 免费成人自拍视频在线| 欧美在线视频观看一二三四区高清| 多乙久久久久久| 哈哈操电影| 超碰性爱97| 日韩人成网站在线播放| 97亚洲中文| 伊蕉97蜜桃97狠狠综合干| 国产女生在线| 成年人黄色视频免费| 亚洲欧美精品久| 久久久夜夜嗨免费视频| 中文?日韩?免费?精品| 天天日美女的B| 狠狠干狠狠色| 国产精品女久久久久av爽| 天天内射| 久久综合18p| 国产AV毛片| 91路www| 久久久久亚洲AV无码专区少妇| 9久久美女首页| 国产精品成人在线| 久久首页| 亚州综合色| 丰满人妻一区| 男人干美女| 91精品啪在线观看国产城中村| 深夜激情| 欧亚韩国999| 性色中出| 偷窥自拍亚洲色图| 先锋色眉乱伦资源| 久久亚洲AV无码白度| 色婷婷久久综合超碰| 天天欧美欧美亚洲网| 五月天玖玖资源站| 欧美精品一区二区少妇免费A片| 高颜值美女口爆高潮浪叫| 二对二中文字幕。| 欧美色图私拍91| 久久高清欧美国产| 久久亚洲AV无码专区国产精品| 欧美天天性| 亚洲国产天堂| 国产搭汕a级片| 亚洲熟久久| 1二区9| 狼人综合婷婷激情四射 | 亚洲在线91| 人妻蜜桃臀| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 精品人妻一区二区免费蜜桃| 热天堂一区二区| 嗯嗯啊在线视频| 120分钟婬片免费看| 日韩人妻 中文字幕| 人妻啪| 国产婷婷综合在线观看| 五月丁香黄色网| 国产品精品自在在线午夜免费| 香蕉视频欧美一卡二卡| 丝袜AV一区二区三区| 99999久久精| 亚洲风情在线观看| 国产9l 大屁股| 2020中文字幕在线观看| 久久久夜夜夜| 俄罗斯及免费在线看| 好爽要喷了| 黄页av| 日本一二区不卡| 国语av狠狠色丁香婷婷综合激情| 日本一区二区中文字幕久久| 99久久久久久亚洲精品不卡| 26uuu性| 欧美专区日本专区| 婷婷综合激情| 国产极品999| 国产精品 午夜福利| 色五月天AV| 天天内射| 日韩综合第八区国产精品| 国产国产亚洲一二三久久| 97超碰欧美精品| 97视频在线看| 欧美 日韩 亚洲 春色| 口爆吞精在线观看| 日韩精品中文字幕二区| 狠狠色色| 91殴美大片| 加勒比东京热五月天天堂网| 人妻第一页| 国产亚洲色婷婷久久99精品91 - 百度| 亚州熟女乱伦| 日本国产高清色www视频在线| 色官网色综合| 亚洲熟妇自偷自拍另欧美| 亚洲欧美爆| 欧美白嫩在线放| 色偷偷综合91久久噜噜| av毛片aaaaa免费看| 一起草日韩| 国产精品大香蕉| 操B久久| 亚洲熟女一区| 中文字幕日韩专区精品系列| 亚欧性爱在线无码| 亚洲丝袜色| 狠狠色一区二区中文字幕| 五月天伊人网| 亚洲无码免费看| 男人的天堂网免费| 亚洲AV色图一区| 亚洲精品久久久久毛片A片拉屎 | 日韩毛片9| 日本操逼无码| 欧美色www亚洲国产阿娇要播| 久久青青草原免费视频| 猛交交| 97超碰色中文字幕| 国产精品99精品视频网站| 国产一区二区视频在线播放| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 国产一级内射无挡观看| av婷婷色网| 中文字幕精品亚洲熟女| 亚洲国产精品成人综合| 大香网站| 久久熟妇五十路一区| 欧美综色欧| jizzjizz欧美| 精品97久久综合| 天天肏天天干| 人妻久久久久久| 欧美精品系列| 亚洲福利影院一区久久| 无码高清专| 2020视频1区2区3区| 精品人妻视频一区二区在线播放 | 99re在线精品78| 欧美精品69性爱| 黑操B| 欧美欧美少妇| 毛片电影一区二区三区| 欧美日韩中国x| 久久东京伊人一本到鬼色| 熟妇人妻一区二区| 秋霞怕怕片| 少妇超碰在线| 午夜爽爽爽| 婷婷五月在线视频| 精品少妇99| 日韩999| 白嫩妹子国产骚| 99热在线观看| 91熟女视频网| 欧美黄色大片在线观看| 亚洲码和欧洲精品激情系列| 张柏芝国产一区在线观看| 天天综合色| 欧美91在线| 爽 好舒服 无码刺激久久| 白嫩91在线亚洲| 免费中文在线| 欧美九一精品久久久熟妇| 免费av大片| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 成人麻豆av电影网站| 亚洲第一二区另类图| 日韩精品一区二区日韩| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 亚洲成人色情五月天丁香花| 中文字幕乱在线伦视频中文字幕乱码在线| 亚洲www91| 国精精品无码一二三区水多多| 欧美激情黑人| 丁香五月综合| 精品蜜乳AV免费观看| 日本 免费 一区二区三区 久久香蕉 | 视频分类 国内精品| 亚洲97资源| 大香蕉色十月| 国产对白刺激视频| 国产suv精品一区二六| 99久久久久| 97色在线视频| 日本东京热大香蕉a片| 国产色呦呦| 国产精品一区二区麻豆| 天天综合日韩网| 1769国内精品视频| 综合情欲网| 翘臀vidoes| 日日噜噜夜夜狠狠视频无| 欧美日韩亚洲国产中文永久天天看| 99re国产中文字幕| 成人久久久| 欧美熟妇亚洲版| 婷婷丁香五月激情啪啪| 性色AV蜜色av色欲av| 亚洲国产蜜臀系列在线观看| 一区二区你上我| 岛国视频一二三区| 在线97视频| 亚洲欧美另类少妇精品| 色香色欲天天综合网天天来吧| 人人妻人人玩人人澡人人爽| 麻豆国产成人精品| 91neishe| 欧美人妻一区| 色视频蜜乳| 96国产精品| 九一精品牛牛一区二区| 很很干很很操| 欧美黄片欧美黄片xxx| 男人天堂网站| 91丝袜激情在线| 1204人成网站色www| 开心激情婷婷| 91情色在线| 久久国产对白激情浪潮| 狠狠狠狠狠狠| 欧美一级AAAAAAA| 久久精品超碰| 黑人与人妻| 盗摄 精品 另类 一区| 国产精品不卡一区二区三区av| 国产专区第一页| 五月丁香亭亭| 91精品人妻电影| 九九九精品成人免费视频小说| 亚州精品人妻一二三区| 亚洲少妇色图自慰直播| 北京专精特新企业招聘信息| 99啪啪| 人人干人人搞人人摸| 岛国片在线视频网站| 96精品久久| 男人的天堂2000| 天天综合~91入口| 激情综合久久| 韩国一级做A片免费的| 欧美1区二区三区公司| 精品一区二区三区国产| 97Ai亚洲| 色区97| 久久大香蕉97| 国产精品一二三| 男人的天堂日韩| 久久草视频污视频| 日本黄色裸日本黄色裸体| 妇女视频网站| 神马久久网| 99这里有精品| 射丝袜高跟鞋99| 91碰碰| 久热9| 超碰在线91| 91chinese在线| 开心五月婷婷激情| 人妻少妇久久久| 男人的天堂2010| 99国内精品| 旡码电影特区| 亚洲高清内射| 人妻爽爽啪视频| 我中文字幕6区| 色踪合AV| 91老妇女| 日韩少妇无码| 天天射夜夜操| 亚洲高清无毛一区二区| 日韩黄片视频试看| 国模艳艳啪啪一区| 亚洲欧美精品福利在线| 久久怡红院| av在线人气| 人妻酒店出差被中出免费在线播放| 国产视频一区二区在线观看| 91在线限制级| 97超碰精品成| 国产精品另类一区大香蕉| 骚货操死你| 农村女一级毛卡片| 欧美性爱免费短视频| 91中文字幕| 人人搞人人插人人操| 久久久久亚洲三级电影| 激情综合二| 亚洲激情综合| 青春草A| 大香交| 免费一二区| 韩国免费播放一级毛片| 日本精品第一视频在'| 试看福利| 高清无码91| 欧美色涩| 巨爆乳一区二区爆乳区| 国产67194| 97色欧州| 欧美综合色,www| 一个色导综合| av九九| 97视频在线免费看| 欧美在线l亚洲| 啊啊啊啊嗯嗯在线久久久| 沈阳熟女高潮对白视频| 亚洲码专区| 国产嫩草精品A88AV在线| 伊人嫩草| 久久国产熟女影院| 日韩成人综合网| 久久 亚洲 日韩 人妻| 伊人宅男大香蕉| 操操吧亚洲乱伦视频| 欧美三级中文字幕hd| 日本久操视频| 神马久久久久久久久| 在线毛片片免费观看| 亚洲成人久久美女| 中文字幕日韩人妻视频一区二区三区交换夫妻| 91欧| 国产强上视频在线观看| 夜夜狼人妻| 四虎精品一区二区| 入口操逼网站| 上床不卡网站| 欧美色网| 亚洲啪啪视频一区二区| 91欧美成人色站| 国产一区在线看| 日本精品高清一二区一本到| 91麻豆天美传媒HD| 国产精品96| 成人精品在线| 色香综合天天影视综合| 天天躁日日躁成人字幕aⅴ| 四月丁香婷婷| 欧美激情黑人| 亚洲毛片一级带毛片基地| 99色在线视频| 亚洲美腿丝袜香蕉影视欧美成人| 欧美黄色大片在线观看| sss视频华人在线| 色九久| 日韩婷婷| 欧美综合色| 另类一区| 抽插一区二区视频| 在线国产福利网址导航| 加勒比日本在线| 天堂性色| 久久久精久久久| 91操操操操| 视频在线观看一二三区| 精品国产乱码久久| 久热伊人99re| 欧美色就是色| 啊啊啊啊啊在线观看网址 | 亚洲中文日韩欧美大香蕉视频| 国产精品。| www.91人妻.com| 国产十八禁视频| 人妻 丝袜美腿 中文字幕| 超碰中文字幕人妻草一区| 男人天堂导航| 日本性爱不卡视频| 91高清日| 欧美夜夜狠| 国产精品久久久啊| 97在线欧洲| 久久久久久电影| 久久综合av| 亚洲欧洲综合视频在线| 日本大香蕉综合网红本杳社区| 日韩中文字幕人妻视频| 久久亚洲一区女同性恋中文字幕| 91免费看中出视频| 激情综合五月婷婷| 国产视频人人网| 99re在线观看| 国产日韩色综合| 亚洲加勒比色图| 亚洲欧洲国产综合av| 中出人妻中文字幕91在线| 精品区国产区一区二区三区| 欧美 亚洲精品首页| 九九久久久久久爱| 一起草日韩| 欧美东京热青青草| 亚洲日韩一区电影| 国产黄色在线播放观看| 欧美最大综合网| www.夜夜操| 欧美日韩午夜精品一区二区三区| 试看60秒| 天天操av懂色| 国产精品探花视频| 欧美综合网A| 精品然女一区二区| 国产无马av| 综合影院永久入口国产| 久久人妻少妇| 蜜桃精品一区二区三区ww| 大香网伊人久久综合网eew| 日本一级二级三级网站| 色97国产69香蕉| www.婷婷六月天| 诱惑网综合| 91蜜臀在线久久久久| 91啦人妻| 久久这里只精品99re66图| 欧美日韩99精品麻豆传媒| 五十路六十路素人熟女| 四虎影视国产精品| 91色噜噜狠狠| 丁香婷婷啪啪| 热无码中文亚洲H一道本一区二区| 亚州精品人妻一二三区| 亚洲中文字幕有码视频一区二区三区| 污污汅18禁网站在线永久免费观看| 超碰碰97资源站| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 歐美性天天| 中文字幕人妻丝袜| 日韩乱中文| 中文字幕天堂在线| 老司机午夜精品福利视频一区二区| 亚洲精品精品一区二区| 久久久久久性爱免费视频| 久草男人天堂| 999久久久九| 1024人妻| 国产亚洲禁久一区二区| 亚洲精品国产日韩无码AV永久免 | 五月天黄色av| 91超级碰| 五月天玖玖资源站| 日本精品网站在线中文| 国产农村妇女精品| 女人香蕉久久毛毛片精品| 玖玖草久草99蜜月一区二区三区| 久久免费中文字幕在线观看| 操碰91| 久久精视频美日韩在线视频| 国产精品点击进入在线影院| 永久免费观看的毛片的网站| 日本媚薬中文字幕在线| 天天激色| 果冻传媒一区二区三区| 亚洲色悠悠久久88| 亚洲综合性网址| 亚洲AV小说| 大香蕉手机视频| 日韩亚洲中文有码视频| 欧美性爱18观看| 午夜啪| 日本天天吊| 久久女婷| 人人扣人人操| 蜜乳AV色欲AVAV无码| 家庭乱伦性爱av| av网站在线看| 国产91亚洲精品一区二区三区| 色网色网色网色网色网色| 欧美色图亚洲色| 尤物视频新赏网鲜网色诱网| 中文字幕av一区二区三区人妻少妇 | 男人天堂一区二区| 日韩精品99999| 久久久精品国产亚洲伊人| 天天91~综合入口| 欧美综合骚| 亚洲天堂另类小说男人| 天天综合香 ld视频| 天天看特黄的免费网站| 91真人天天在线| 伊人久久亚洲色欲综合网站 | 亚洲有薄码区日本系列中文字幕| 狠狠综合网| 日韩久久三区| 国产视频一区二区在线观看| 精品99999久久久久久| 熟女中出视频| 加勒比伊人影院| 亚洲,欧美,综合网| 精品999一区二区| 久久永久无码人妻视频| 都市久久精品激情亚洲| 国产精品久久久久中文字幕| 国产精品亚洲美女久久久久| aaaa少妇高潮大片| 亚洲激情AV| 日本不卡码黄色| 少妇内射www在线观看视频| 国产欧美日产一区二区三区 - 国产欧美日 | 大香蕉欧美| 日韩综合成人免费视频| 欧美色性爱| 丁香五月天堂网| 玖玖蜜臀资源网| 日韩高清一二三| 亚洲久久久| 高清国产性猛交xxxx乱大交| 91操操操操| 高清无码在线播放网站| 国产午夜无码片在线观看影视| 婷婷视频网| 欧美图片色综合| 色色青青久久| 欧美亚洲| 美国一区二区免费视频| 熟妇熟女亚洲天堂网| av东京热男人的天堂| 精品乱码在线观看| 香蕉99秘 一区精品蜜桃臀| 亚洲乱色熟女一区| 亚洲中文字幕av| 亚洲黄日韩无码专区| 欧美亚洲日韩16色| 蜜臀久久99精品久久久久久酒店| 日本高清视频xxxx| 五月天婷婷久久| 97爱b| 九九九不卡| 波多野结衣一级视频| 九九伊人网| 60秒免费视频| 亚洲一区在线观看欧洲| 精品久久久亚洲AV成人网站| 亚洲人成网www| 精吧天堂| 一级性爱啪啪视频| 蜜臀久久99精品久久综合| 久操影视| 操操操五月天婷婷丁香影院| 超碰人人草| 男人的天堂在线| 91无码西班牙视频在线| 久久露脸国产老熟女| 影音先锋一区二区在线资源| 久草尤物| 精品少妇一区二区三区免费观看| 色阁阁AV综合网| 国产精品白丝在线播放| 人妻嗯啊啊在线播放| 曰本道人妻久久久在线不卡色视频 | 老熟女乱伦一区| 精品久久一区二区三区四区五区| 加勒比AV天堂| 麻豆国产97在线| 中文字幕亚韩| 另类亚洲图色| 国产三级在线现体验区| 偷拍欧美激情| 91n欧美| 激情小说五月天| 九九久久国产精品怡红院| 亚洲第一黄色av网站| 免费网站观看www在线观| 欧美v日韩v亚洲v最新在线| 欧美操人| 亚州欧美另类| aaa一级黄片| 亚洲 欧美 日韩另类 麻豆| 国产女人操逼视频| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 四虎免费在线观看| 日本在线一二| 99热这里只有精品18| 欧美国产日韩清纯唯美| 天天操狠狠日夜夜干超大胆开放com大香蕉视频在线观看 | 久久做97| 午夜视频久久久久一区| 欧美少妇第一页| AA级电影三区| 日韩精品区二区三区不卡| 69一区二区| 伊人五月天青青草婷婷| 亚洲一区二区在线观看91| 女人妻一区| CCYY草草影院地址入口| 超碰1024久久| 2019天天干| 99热精品青草在线 | 九九色逼| 9久久久久| 丝袜内射| 看大黄色大片原件| 极品色电影院| 亚洲成人av电影在线| 色臀aV| 口爆吞精在线观看| 青青草字幕AV| 成人av动漫在线观看| 九九操久久国产免费视频| 又黄又爽在线观看视频| 国产久久久| 麻豆性爱视频在线播放| 在线综合色| 午夜传煤十二区精品| 999岛国大片| 亚洲干B| 伊人97超碰| 精品人妻1区| 在线电影亚洲色图| 红杏大香蕉| 91成人18| 人人摸人人舔一区二区| 色婷婷成人| 亚洲欧美国产va在线播放频| 亚洲美女 晚间男人天堂 | 欧美在线官网| 亚洲在线网站| 精品视频97| 岛国精品视频在线观看| 欧美91精品国产自产| 国模限制级电影| 黄色AAAAAAAAAAA大片| 国产白丝网站| 91国产大片| 久久露脸国产老熟女| 夜夜爽夜夜操| 亚洲天堂另类小说男人| 少妇厨房愉情理伦片bd在线观看| 天天综合网91入口| 国产二区三区免费视频| 狠狠狠一区二区三区| 国产区91柔拿会所技师| 欧美一区二区三熟女剧情| 精品四五区| 欧美精品久久久久久久久88| 91 欧美| 欧美欧美啪啪视频| 日本操逼无码| 亚码激情| 性欧美999| 精品综合久久久久久97| AV女资源| 人妻爽爽啪视频| 色色99| TS人妖另类精品视频系列 | 九九九影院| 国产精品一区二区三区,亚洲综合 性开放中文AV高清无码免费看 | 深喉吞精| 色臀aV| 75大香蕉| 久久国产三区| 操逼逼无码| 久久欲| 大屁股熟女一区二区三区| www.99热| 超清福利精品视频在线| 97超碰香蕉| 久久婷婷苹果| 日韩一级二级三级免费看完整版国语版 | 日本超碰在线国产一区| 肉嘟嘟www视频在线观看高清| 久久伊人最新网址视频| 91老司机精品| 啊啊啊啊好疼视频| 亚洲淫乱骚妇AV| 91国产精品熟女| 婷色五月天| av一区二区三区 中文| 国产高清成人mv在线观看| 日韩欧洲操屄视频| 亚洲熟妇AV日韩熟妇在线| 热思思免费视频| 亚洲中文字幕一区二区| 精品中文一区二区| 色偷偷色偷偷欧美日韩| 800zy一区二区| 日韩乱码Av| 一区二区你上我| 深夜激情无码| av黄图片在线观看| 午夜美女诱惑电源网| 人人妻人人色一区二区三区| 啊啊啊啊啊啊啊在线| 热热热热日日漂亮永久永久国产日| 美女人妻色网站| 91九九九馒头| 97综合在线观看| 99r九九| 欧美亚洲激情小说| 久久九九99| 丁香五月社区| 精品国产精品一区二区| 日本一级性爱| 另类专区在线观看| 超碰在线看| 五月天婷婷影院| 亚 欧 美 综合| 后入 亚洲 美女 射| 老熟女乱伦一区| 欧美色视| 中国特猛少妇色xxx| 欧美视频第二页| 欧美色日本| 91九九九吃| 男人天堂最新手机版在线青青草| 91夜夜蜜桃臀1区2区3区| 亚洲日本男人天堂网| 人人妻人人色| 亚州国产成人精品女人久久| 国产精品粉嫩福利在线| 天天综合网AV91| 99热国产精品| 欧美色另类| 亚洲自拍97| 日韩精品资源专区二区| 午夜乱轮操逼视频免费看| 大香蕉一区二区在线观看.| 欧美成年人性爱视频免费观看| 91人精品妻入口| 亚洲第2页| 九月婷婷综合| 超碰午夜在线|