欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

ARTICLE DETAIL

資訊詳情

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

C++11新特性實戰(zhàn):列表初始化、移動語義、lambda與function/bind

C++11新特性實戰(zhàn):列表初始化、移動語義、lambda與function/bind C11【第七篇】 ——— 列表初始化、移動語義、可變參數(shù)模板、lambda表達式、function包裝器和bind包裝器C11這批特性出來之后很多老代碼的回頭率真的低了不少。列表初始化、移動語義、可變參數(shù)模板、lambda、function、bind這幾個東西單獨拿出來每一個都能寫幾千字但日常開發(fā)里它們往往是一起出現(xiàn)的移動語義解決深層拷貝的痛lambda順手解決回調冗長的問題function和bind把各種可調用對象收編成統(tǒng)一類型可變參數(shù)模板在日志和工廠函數(shù)里直接省掉一坨重載。這篇作為C11系列第七篇默認你已經(jīng)有C98的使用基礎能看懂模板、類、左值右值的基本概念但對這批現(xiàn)代C特性還沒有系統(tǒng)梳理過。我會結合自己實際改代碼、寫庫、做框架時踩過的坑把每個語法的核心作用、底層邏輯和典型場景說透。1. 列表初始化C11給初始化方式立的規(guī)矩1.1 為什么一定要用花括號C98時代初始化方式散得離譜。數(shù)組有int arr[] {1,2,3};結構體可以Point p {1,2};單個變量既可以直接賦值int x 5;也可以用構造std::vectorint v(10);連指針初始化還分nullptr出來之前用NULL又是一堆坑。散亂意味著什么意味著代碼風格不統(tǒng)一意味著模板代碼想把任意類型初始化成一個值非常麻煩。C11給出的方案是統(tǒng)一花括號初始化列表初始化。不管是內置類型、數(shù)組、結構體、還是std::vector、std::map這種容器都可以用一對花括號把初始化列表寫清楚int x{ 5 }; int arr[]{ 1, 2, 3 }; Point p{ 1, 2 }; std::vectorint v{ 1, 2, 3, 4 }; std::mapstd::string, int m{ {a, 1}, {b, 2} };這個看似簡單的改動最大的意義在于讓初始化變成了“一種可以傳給模板和泛型代碼的語法結構”。我在寫泛型工廠時最直觀的感受就是以前要從一個參數(shù)列表去構造任意類型你得手寫一堆構造調用有了列表初始化和后面要講的可變參數(shù)模板一套代碼就能把任意類型任意參數(shù)的構造都接住這個收益是長期存在的。另外花括號初始化也在代碼風格上給出了極大的整潔度。團隊里只要規(guī)定“能用花括號初始化就盡量用”新老代碼的閱讀成本立刻下降這個對維護期的收益比很多人想象的大。1.2 initializer_list 與構造函數(shù)的“搶人大戰(zhàn)”花括號初始化背后依賴的核心類型是std::initializer_listT。當一個類定義了接受std::initializer_listT的構造函數(shù)時用花括號初始化它就會優(yōu)先走這條路徑class MyData { public: MyData(std::initializer_listint list) { std::cout initializer_list 構造, 元素數(shù)量 list.size() std::endl; } MyData(int a, int b) { std::cout (int, int) 構造 std::endl; } }; MyData d1{ 1, 2, 3 }; // 走 initializer_list MyData d2(1, 2); // 走 (int, int) MyData d3{ 1, 2 }; // 注意走 initializer_list 而不是 (int, int)這就是經(jīng)典坑點只要該類有 initializer_list 構造函數(shù)花括號初始化就優(yōu)先匹配它哪怕另一個普通構造函數(shù)匹配得“更精確”也不行。d3{1, 2}這種寫法很多人以為會走進(int, int)實際卻去了列表構造結果可能完全不一樣。這類問題在標準庫容器上表現(xiàn)得更加直接std::vectorint v1(10, 1); // 10個元素全部為1 std::vectorint v2{ 10, 1 }; // 2個元素分別是10和1v2這種寫法在代碼評審里經(jīng)常被年輕人拿來炫技但誤用也確實容易產(chǎn)生邏輯錯誤。生產(chǎn)環(huán)境下我更建議容器初始化明確的數(shù)據(jù)用花括號想要“填充n個值”這種語義就用圓括號別讓閱讀者猜。1.3 窄化轉換編譯期的安全檢查列表初始化另一個被低估的價值是禁止窄化轉換narrowing conversion。所謂窄化就是把一個高精度或大范圍的值隱式轉換成一個可能精度丟失或范圍縮小的類型。C98里這些都是默許的頂多出個警告但警告經(jīng)常被忽略double pi 3.14159; int a pi; // 編譯通過警告后靜默截斷 int b{ pi }; // 編譯錯誤double 到 int 是窄化轉換用花括號初始化時編譯器把這類轉換直接判為錯誤逼你顯式寫出意圖int b{ static_castint(pi) }; // 顯式轉換OK這個特性在維護大型項目時是個保護傘。我見過太多因為類型轉換丟精度產(chǎn)線上出事故的case罪魁禍首全是那些裸的隱式轉換?,F(xiàn)在不少現(xiàn)代代碼規(guī)范直接規(guī)定初始化必須用花括號顯式轉換必須用 static_cast兩者配合從源頭掐掉了一大批類型相關的隱蔽bug。唯一需要留意的是如果你在寫老代碼遷移一股腦全改成花括號初始化那編譯器會突然報出一堆“無法編譯”的錯這時候先別慌著用 static_cast 強行改回去要逐個確認那個窄化到底是有意還是無意往往能發(fā)現(xiàn)幾個之前被忽略的真實缺陷。2. 移動語義拷貝之外的第二條路2.1 右值引用到底在表達什么在C11之前左值右值的概念在語法層面只有“能不能取地址”這種粗糙的區(qū)分。C11引入右值引用之后我們可以寫一個專門接收“臨時對象”的接口臨時對象本質上是一個馬上要被銷毀的資源包這時再去深拷貝就是白白浪費性能。移動語義的精髓不是“快一點”而是“本來就不用復制”。右值引用理解上有個常見障礙它不是用來給變量“起一個右值的別名”的而是表示“這個東西是可以被掏空的臨時資源”。所以std::move的邏輯其實是把一個左值顯式地標注成“我允許你把它當臨時對象掏空”之后移動構造函數(shù)就會把資源指針直接拿過來把源對象置為空。class BigBuffer { public: BigBuffer(size_t size) : size_(size), data_(new char[size]) { memset(data_, 0, size); } // 拷貝構造深拷貝整塊內存 BigBuffer(const BigBuffer other) : size_(other.size_), data_(new char[other.size_]) { memcpy(data_, other.data_, size_); std::cout 拷貝構造被調用 std::endl; } // 移動構造直接接管指針 BigBuffer(BigBuffer other) noexcept : size_(other.size_), data_(other.data_) { other.data_ nullptr; other.size_ 0; std::cout 移動構造被調用 std::endl; } ~BigBuffer() { delete[] data_; } private: size_t size_; char* data_; };看這個BigBuffer的兩個構造拷貝構造要把整塊內存復制一份如果這塊內存是幾十MB一次深拷貝就是幾十MB的讀寫移動構造只是把指針從源對象手里拿過來再把源對象指針置空成本幾乎為零。這個差別在容器動態(tài)擴容、函數(shù)按值返回、中間臨時對象傳遞這些場景中是數(shù)量級的性能差異。2.2 移動賦值與“源對象被掏空”的紀律有移動構造自然就有移動賦值BigBuffer operator(BigBuffer other) noexcept { if (this ! other) { delete[] data_; data_ other.data_; size_ other.size_; other.data_ nullptr; other.size_ 0; } return *this; }注意這里必須先釋放自己原有的資源然后接管對方資源最后把對方置空。不釋放就接管會造成內存泄漏少了置空那一步則會導致源對象的析構函數(shù)把同一塊內存delete兩次直接觸發(fā)double-free問題。移動之后源對象處于“有效但未指定”的狀態(tài)標準要求它是可以安全析構、可以重新賦值的但你不能假設它里面還有原來的數(shù)據(jù)。我見過有人把std::move之后的源對象又拿去當普通變量用讀取到nullptr或者空字符串時一臉懵。所以誠實的做法是移動完一個對象后要么立即丟棄它要么明確把它重新初始化/賦值成可用的狀態(tài)。這里必須強調一個新手常見的幻覺移動語義并不是自動發(fā)生的它需要類本身定義移動構造函數(shù)/移動賦值。如果我們的BigBuffer只寫了拷貝構造沒有移動構造那么即使調用方把臨時對象std::move過來實際執(zhí)行的還是拷貝構造。很多性能敏感的代碼沒達到預期效果排查半天最后發(fā)現(xiàn)是類沒寫移動構造白白浪費了std::move的姿態(tài)。2.3 完美轉發(fā)std::forward 的正確用法模板編程中經(jīng)常遇到一個需求寫一個中間轉發(fā)函數(shù)把參數(shù)原樣轉給另一個函數(shù)并且要保留參數(shù)的左值/右值屬性——如果原來是左值繼續(xù)當左值傳過去如果是右值就保持右值屬性讓目標函數(shù)能夠移動它。這就是完美轉發(fā)。轉發(fā)引用也叫萬能引用的寫法是T它只在模板推導環(huán)境下成立templatetypename T void Relay(T arg) { // 這里如果直接傳 arg會丟失右值屬性 Process(std::forwardT(arg)); }std::forwardT的作用是根據(jù)T的推導類型來決定把arg轉換成左值還是右值。如果調用Relay時傳進來的是右值臨時對象T會被推導成某個具體類型forward就會把arg重新轉回右值引用讓下游能用移動語義接管它如果傳進來的是左值T推導成左值引用forward就原樣以左值傳遞。我在實現(xiàn)一些“軟件總線”式的中轉模塊時經(jīng)常用這個手法一個函數(shù)接收任意類型任意數(shù)量的參數(shù)然后轉發(fā)給真正處理請求的對象。不用完美轉發(fā)的話參數(shù)每經(jīng)過一層中轉都會損失類型信息臨時對象被迫退化成拷貝性能在多層轉發(fā)后會累積惡化。3. 可變參數(shù)模板編譯期的參數(shù)“打包”和“拆包”3.1 參數(shù)包怎么定義和展開可變參數(shù)模板讓函數(shù)和類可以接受任意數(shù)量、任意類型的參數(shù)。這在C98里只能靠重載或者va_list這種類型不安全的方式實現(xiàn)而在C11里參數(shù)的類型安全由編譯器保證。定義一個可變參數(shù)模板函數(shù)最基本的樣子templatetypename T void PrintOne(T value) { std::cout value std::endl; } templatetypename T, typename... Args void PrintMany(T first, Args... rest) { std::cout first ; PrintMany(rest...); }Args是一個模板參數(shù)包rest是一個函數(shù)參數(shù)包。rest...這個語法叫參數(shù)包展開把當前函數(shù)收到的剩余參數(shù)逐個展開再去調用下一層。整個遞歸過程會在參數(shù)包為空時落到那個單參數(shù)的重載上形成終止條件。很多初學者剛看到這個遞歸會覺得恐怖其實它就是編譯器在編譯期做了N層實例化每一層削掉一個參數(shù)直到削光。每個不同的參數(shù)組合都會生成一個獨立的函數(shù)實例所以如果調用方參數(shù)類型很多模板實例化數(shù)量也會增加編譯時間變長。但換來的是運行時的絕對高效——所有參數(shù)處理都發(fā)生在編譯期運行時沒有一個額外的分支判斷。sizeof...可以在不遞歸的情況下直接獲得參數(shù)個數(shù)templatetypename... Args void CountArgs(Args... args) { std::cout 模板參數(shù)個數(shù) sizeof...(Args) std::endl; std::cout 運行時參數(shù)個數(shù) sizeof...(args) std::endl; }這個操作符在遞歸展開前做數(shù)量判斷非常有用可以提前剪枝一些特化分支。3.2 遞歸展開最常見的套路可變參數(shù)模板最樸素的用法就是一個“處理一個剩下的交給下一層”的遞歸展開。上面打印的例子就是這樣的但實際項目中我更多用它做日志系統(tǒng)。比如寫一個能把任意類型任意數(shù)量參數(shù)拼進一條日志消息的工具class Logger { public: templatetypename... Args void Log(Args... args) { std::ostringstream oss; Append(oss, std::forwardArgs(args)...); WriteLine(oss.str()); } private: templatetypename T void Append(std::ostringstream oss, T value) { oss std::forwardT(value); } templatetypename T, typename... Args void Append(std::ostringstream oss, T first, Args... rest) { oss std::forwardT(first); Append(oss, std::forwardArgs(rest)...); } };這里我特意用了Args...轉發(fā)引用保證傳入的臨時字符串在拼日志時不會經(jīng)歷不必要的拷貝。日志系統(tǒng)往往處在高頻路徑上這類微小的性能優(yōu)化在實際壓測中是能看出來的。使用遞歸展開要注意一個細節(jié)遞歸調用必須用rest...把剩下的參數(shù)展開少寫一個省略號編譯器會立刻報錯“參數(shù)包必須至少展開到一個參數(shù)”。錯誤信息比較長新手容易慌其實核心就是檢查省略號位置。另外終止重載有條件是不能依賴運行時判斷的必須是編譯期的結構——要么用重載特化要么用if constexprC17的解決方案C11下比較穩(wěn)妥的辦法就是用重載或者偏特化來終止。3.3 逗號表達式展開不用遞歸的另一種方案遞歸展開思路清晰但每到N層參數(shù)就要實例化N個函數(shù)編譯時間會變成負擔。還有一種更緊湊的展開語法利用逗號表達式和初始化列表一次性把參數(shù)全部處理完templatetypename... Args void PrintAll(Args... args) { int dummy[] { (std::cout args, 0)... }; (void)dummy; }拆開看(std::cout args, 0)是一個逗號表達式——先執(zhí)行std::cout args再把0作為整個表達式的值。然后對這個表達式做參數(shù)包展開得到的實際是int dummy[] { (std::cout arg1, 0), (std::cout arg2, 0), ..., 0 };因為std::cout arg1返回的還是流對象不是int為了湊出數(shù)組元素類型為int用逗號表達式的0來兜底。這個技巧不必搞得花里胡哨但確實在一些空格分隔、不分層的場景比如把多個字符串直接拼進一個緩沖區(qū)里比遞歸更簡潔也省了一次次實例化遞歸殼子的開銷。我還見過一種變體是用std::initializer_listint{ (fun(args), 0)... }來展開效果類似。不管哪種寫法核心都是“用逗號表達式把真正的參數(shù)操作變成數(shù)組初始化表達式列表”這是C11時代沒有折疊表達式時的經(jīng)典套路。到C17之后折疊表達式(std::cout ... args)直接把這個場景簡化成一行但如果你的項目還鎖在C11標準這兩種展開方式就得熟練掌握。4. Lambda表達式就地定義一個匿名函數(shù)對象4.1 完整語法和默認行為lambda表達式提供了一種就地定義匿名函數(shù)對象的方式常見的完整語法長這樣[捕獲列表](參數(shù)列表) mutable - 返回類型 { 函數(shù)體 };最簡化形態(tài)甚至可以省略圓括號和返回類型比如auto f [] { std::cout hello std::endl; }; auto add [](int a, int b) { return a b; };返回類型在函數(shù)體只有一個return時一般可以靠auto推斷但如果函數(shù)體內多處返回不同類型的值或者類型比較復雜就需要顯式寫上尾置返回類型auto transform [](const std::string s) - int { return static_castint(s.size()); };關于mutable關鍵字有個容易混淆的點lambda的默認行為是捕獲列表里的值拷貝并且在lambda體內是只讀的。想修改拷貝進來的變量必須加mutableint count 0; auto counter [count]() mutable { return count; }; counter(); // 1 counter(); // 2 std::cout count; // 仍然是 0說明改的是lambda內部拷貝的值不加mutablecount這行會直接編譯報錯。很多人看到這個報錯第一反應是“是不是lambda不能修改外部變量”其實是忘了它是只讀語義。4.2 捕獲方式的選擇值、引用、混合捕獲捕獲列表是lambda的靈魂也是最容易產(chǎn)生生命周期bug的地方。幾種寫法各有適用場景[value]按值捕獲lambda內部持有外部變量的拷貝。[ref]按引用捕獲lambda內部持有的是外部變量的引用。[]默認按值捕獲所有使用到的變量。[]默認按引用捕獲所有使用到的變量。[, flag]混合捕獲flag用引用其余按值。按值捕獲看起來安全但要注意它拷貝的是“捕獲時刻”的變量快照。下面這段代碼是經(jīng)典陷阱std::functionvoid(int) funcs[5]; for (int i 0; i 5; i) { funcs[i] [i](int x) { return x i; }; // OKi按值捕獲每個lambda有自己的i快照 }如果把[i]寫成[]或者[i]那么所有l(wèi)ambda共享同一個i變量的引用循環(huán)結束后 i 的值是5所有l(wèi)ambda再執(zhí)行時拿到的都是5。這個錯誤在“循環(huán)里注冊回調”的場景中幾乎人人都會踩一腳而且非常隱蔽因為編譯毫無問題只有運行時行為不對。另一類生命周期問題是引用捕獲局部對象。比如有一個函數(shù)創(chuàng)建了一個局部對象然后返回一個捕獲了該對象引用的lambdastd::functionint() MakeFunctor() { int v 42; return [v]() { return v; }; // 引用懸空函數(shù)結束后v已銷毀 }這種代碼就是未定義行為。正確做法是按值捕獲[v]或者把局部對象放到堆上并用std::shared_ptr管理后讓lambda捕獲智能指針的拷貝。我在代碼評審中見過好幾例類似寫法全是抱著僥幸心理覺得“這個函數(shù)應該不會很快返回吧”結果程序運行一段時間后偶發(fā)亂值排錯成本遠超寫代碼成本。4.3 lambda在STL算法中的實戰(zhàn)lambda在C11里最大的用武之地是配合algorithm頭文件里的算法。以前寫std::sort要定義一個比較函數(shù)或者函數(shù)對象// C98風格 bool CmpDesc(int a, int b) { return a b; } std::sort(v.begin(), v.end(), CmpDesc);有了lambda之后std::sort(v.begin(), v.end(), [](int a, int b) { return a b; }); std::vectorint nums{ 5, 3, 8, 1, 9 }; int threshold 5; auto count std::count_if(nums.begin(), nums.end(), [threshold](int x) { return x threshold; });這種寫法把邏輯直接放到使用處既避免了“函數(shù)定義和使用地點分離導致的上下文割裂”又天然支持捕獲外部變量比函數(shù)對象寫起來緊湊得多。我習慣把lambda用在項目里的這些高頻場景做排序、查找、過濾的自定義謂詞作為事件回調、定時器的處理函數(shù)延遲執(zhí)行一小段邏輯比如保存到資源析構時才執(zhí)行的清理動作配合std::function做接口統(tǒng)一的策略回調。使用lambda時最好遵循一個原則lambda函數(shù)體不要寫太長。正常四五行的邏輯是最舒服的如果超過十幾行說明這段邏輯值得提取成一個具名函數(shù)或成員函數(shù)否則代碼的可讀性會因為“嵌套在一堆算法調用里的匿名邏輯”而急劇下降。5. function包裝器把可調用對象統(tǒng)一收納5.1 std::function 的使用與類型擦除std::function是一個通用多態(tài)函數(shù)包裝器它可以存儲、復制、調用任何可調用對象包括普通函數(shù)、函數(shù)指針、lambda表達式、函數(shù)對象以及用std::bind生成的綁定對象。它的核心價值在于用一個統(tǒng)一的類型去表示“具有特定簽名的可調用操作”。#include functional std::functionint(int, int) op; op [](int a, int b) { return a b; }; // lambda op [](int a, int b) { return a * b; }; // 換個lambda op std::multipliesint(); // 函數(shù)對象 op MyFunc; // 普通函數(shù)這個能力背后是類型擦除機制。簡單說std::function內部維護了一個抽象基類和一個具體的包裝類模板模板里面保存著原始可調用對象的副本同時實現(xiàn)了統(tǒng)一的調用接口operator()。外部只看到std::functionint(int,int)這樣一個明確的簽名不知道里面到底存的是函數(shù)指針、lambda還是函數(shù)對象。這個過程有點像“把所有形狀各異的插頭插到一個萬能插座上對外只暴露同一個三相插口”。在實際工程里std::function最大的意義在于把回調注冊、策略注入、事件分發(fā)這些場景的可調用對象類型全部統(tǒng)一了。比如一個按鈕的點擊事件回調你既可以注冊一個成員函數(shù)通過bind也可以注冊一個lambda外部存儲的都是std::functionvoid()。5.2 回調場景下的正確姿勢我重構過一些把裸函數(shù)指針作為回調參數(shù)的舊模塊最大的痛點就是函數(shù)指針無法捕獲狀態(tài)。你想傳一個“帶業(yè)務上下文”的回調只能通過void* user_data再傳一個裸指針各種生命周期隱患。有了std::function之后業(yè)務數(shù)據(jù)可以直接被lambda捕獲根本不需要void*這種極度不安全的通道。真實模塊里經(jīng)常是這樣的class EventDispatcher { public: using Handler std::functionvoid(const Event); void RegisterHandler(int eventType, Handler handler) { handlers_[eventType].push_back(std::move(handler)); } void Dispatch(int eventType, const Event evt) { auto it handlers_.find(eventType); if (it ! handlers_.end()) { for (auto h : it-second) { h(evt); } } } private: std::unordered_mapint, std::vectorHandler handlers_; };這個模式在各語言里都很常見C11以前要實現(xiàn)得費不少勁現(xiàn)在用std::function幾行搞定。注意我在RegisterHandler里用了std::move(handler)因為std::function內部保存的是可調用對象的副本這步能省一次深度拷貝。5.3 function 的性能與坑std::function性能上確實有開銷核心是間接調用和可能的堆分配。它內部存儲可調用對象的副本如果可調用對象小比如無捕獲的lambda等同于一個函數(shù)指針很多實現(xiàn)在棧上通過小對象優(yōu)化就直接存了但如果捕獲了大量狀態(tài)的lambda體積大就可能觸發(fā)動態(tài)內存分配。我在做高頻回調系統(tǒng)時實測過用裸函數(shù)指針一次間接調用幾納秒到幾十納秒std::function會有額外幾納秒到幾十納秒的開銷。在真正的熱路徑比如每幀幾十萬次回調上這個開銷會被放大這時要么換裸函數(shù)指針要么用更輕量的專用回調類型。另一個坑是拷貝std::function的開銷。std::function是可拷貝的但拷貝一個里面裝了很大lambda的std::function等于拷貝了那份捕獲狀態(tài)。所以函數(shù)傳參和注冊時優(yōu)先用const std::function...接收內部需要保存時再拷貝或std::move別動不動作值傳遞// 不推薦 void RegisterCallback(std::functionvoid() cb) { callbacks_.push_back(cb); // 至少一次拷貝 } // 推薦 void RegisterCallback(const std::functionvoid() cb) { callbacks_.push_back(cb); } // 或者右值版本 void RegisterCallback(std::functionvoid() cb) { callbacks_.push_back(std::move(cb)); }如果某個std::function永遠沒有被調用但它的捕獲對象很大那么這個對象就一直占著內存直到std::function被銷毀或重新賦值。一些長生命周期的事件表容易在不知不覺中累積大量捕獲上下文排查內存占用時記得檢查std::function的捕獲體量。6. bind包裝器把函數(shù)參數(shù)“提前預定”出新的可調用對象6.1 std::bind 的基本操作std::bind用來生成一個“綁定了一部分參數(shù)”的新可調用對象它把事情分成兩半一半在處理函數(shù)定義完之后就已知另一半留給真正調用時再傳。#include functional int Add(int a, int b) { return a b; } using namespace std::placeholders; auto add5 std::bind(Add, 5, _1); std::cout add5(3) std::endl; // 輸出8等價于 Add(5, 3) auto add5and10 std::bind(Add, 5, 10); std::cout add5and10() std::endl; // 輸出15參數(shù)全部綁定調用時無需傳參_1、_2這些是占位符表示“這個位置留給調用時傳入的第一個、第二個參數(shù)”。占位符放在第幾個位置就代表調用傳入的參數(shù)填到對應位置。利用這個機制還可以調整參數(shù)順序auto swapAdd std::bind(Add, _2, _1); std::cout swapAdd(3, 4) std::endl; // 等價于 Add(4, 3)輸出7這個“參數(shù)重排”能力在適配第三方接口時非常實用。比如一個消息處理器的回調簽名是void Handle(int msgType, int priority, const Message msg)而你的處理函數(shù)只關心 priority 不為0的消息并且你的處理函數(shù)簽名是void Process(const Message msg)可以直接auto binder std::bind(Processor::Process, processor, std::placeholders::_3); // 只取第3個參數(shù)傳給Process6.2 綁定成員函數(shù)和對引用的處理綁定成員函數(shù)是std::bind的高頻用法。成員函數(shù)隱含第一個參數(shù)是對象本身所以Processor::Process后面要么接對象指針要么接對象引用或拷貝Processor processor; auto binder std::bind(Processor::Process, processor, std::placeholders::_1); // 或者 auto binder2 std::bind(Processor::Process, processor, std::placeholders::_1); // 按值拷貝對象注意大對象拷貝開銷我個人的習慣是對象生命周期明確長于回調時用processor綁定不確定生命周期時優(yōu)先考慮std::shared_ptrProcessor的拷貝加std::bind的占位策略甚至直接改用lambda捕獲智能指針更直白。綁定引用參數(shù)時有個隱蔽坑std::bind默認按值保存綁定參數(shù)。如果函數(shù)參數(shù)是引用類型直接 bind 一個變量進去實際綁定的是它的拷貝函數(shù)內部改引用不會影響原變量。想要綁定真正的引用必須使用std::refvoid UpdateCount(int n) { n 10; } int count 0; auto binder std::bind(UpdateCount, count); // 按值綁定改了沒反應 auto binderRef std::bind(UpdateCount, std::ref(count)); // 綁定真實引用 binder(); binderRef(); std::cout count; // 輸出10binderRef那次修改生效了std::ref返回一個引用包裝器這是一個C11里看起來簡單但使用頻率不低的工具。凡是需要把引用“當值”傳遞的場景包括std::thread、std::bind、std::function的捕獲都必須靠它來表達引用語義。6.3 bind 和 lambda 該怎么選很多人糾結std::bind和lambda哪一個更好。我的結論非常直接C11項目里能用lambda的地方優(yōu)先用lambda只有在確實需要參數(shù)重排、或者一些極其簡單的綁定場景才考慮bind。原因有三方面。第一lambda語法更直觀可讀性更好[processor](int x){ processor.Process(x); }一眼能看懂捕獲了誰調用了誰而std::bind(Processor::Process, processor, _1)對不熟悉bind的人來說還要反應一下。第二lambda的捕獲是顯式的[]、[]、[a]而bind是隱式按值保存在內部包裝對象里排查生命周期問題時lambda更直觀。第三編譯器對普通lambda的優(yōu)化能力比對std::bind生成的復雜包裝對象更強內聯(lián)概率更高。但 bind 并不是完全沒有價值。在某些需要真正“參數(shù)重排”的適配場景或者早期C11代碼風格已經(jīng)在團隊里形成慣例的項目里bind依然是可讀的。而且std::bind和std::function配合得相當自然std::functionvoid(int) callback std::bind(Processor::Process, processor, _1);在C14、C17之后泛型lambda和更高階特性的引入讓 bind 的使用場景更少了但如果你的項目還被鎖在C11標準bind 仍然是所有標準庫容器和類接口里的“一等公民”該會還得會。7. 常見問題與排查技巧實錄實際代碼中把這些特性組合使用踩坑的概率并不低。我把這幾年見過的高頻問題整理成一組速查方便大家對照。問題現(xiàn)象根本原因排查思路與修復花括號初始化導致窄化編譯錯誤int x{doubleVal}被禁止窄化顯式static_castint或者改用圓括號初始化如果確實需要舊行為深拷貝意外發(fā)生性能突然下降類沒有定義移動構造/移動賦值或者傳參時忘了std::move檢查類是否有noexcept移動構造檢查熱路徑上的拷貝調用循環(huán)內注冊的lambda回調值全部相同引用捕獲了循環(huán)變量變量最終是同一個終值改按值捕獲[i]或拷貝一份局部臨時變量再捕獲lambda按引用捕獲的對象已銷毀局部變量生命周期結束引用懸空按值捕獲或者把對象生命周期延長到堆上并用智能指針接管可變參數(shù)模板遞歸沒有終止重載缺少單參數(shù)版或者特化像PrintMany例子那樣補一個templatetypename T void Print(T)作為終止std::bind綁定引用參數(shù)但外部值不改變bind默認按值保存參數(shù)用std::ref顯式包裝引用std::function頻繁拷貝導致卡頓大捕獲狀態(tài)的function被反復按值傳遞函數(shù)參數(shù)用const std::function...接收存儲時std::move7.1 初始化相關的坑列表初始化最大的兩個坑是窄化轉換和initializer_list的優(yōu)先級。窄化轉換編譯錯誤一般不難定位關鍵是要定好項目規(guī)范在需要強制類型安全的代碼路徑上統(tǒng)一用花括號初始化。initializer_list的優(yōu)先級問題則更難防我的經(jīng)驗是凡是定義了initializer_list構造函數(shù)的類在代碼評審時要特意檢查所有{}初始化的位置確認確實是想走列表構造而不是普通構造。標準庫里std::vector、std::map、std::list都有這種行為稍不留神就會把“構造10個元素”寫成“構造1個元素內容為10”。7.2 lambda捕獲引發(fā)的懸空引用lambda捕獲問題的根源是生命周期管理。值捕獲雖然安全但也有代價捕獲了超大對象的lambda一旦存入std::function那個對象就一直被持有到function銷毀。如果這個function被存進全局容器那就是隱形的內存占用。我在實現(xiàn)定時任務系統(tǒng)時遇到過一個案例定時器回調捕獲了一個幾十MB的配置對象結果這個定時器對象一直存放在調度表里幾十MB內存被白白占著。后來改成捕獲std::shared_ptrConfig的拷貝并且在回調完成時從調度表移除問題才解除。7.3 可變參數(shù)模板遞歸不終止遞歸展開的模板如果不加終止條件編譯器會無限遞歸實例化下去最終報錯信息里會出現(xiàn)recursively required from 函數(shù)名...展開的模板list一長串看得人頭皮發(fā)麻。排查方法很簡單從報錯信息里找到最內層那個沒有終止重載的調用點補上單參數(shù)版本或者空參數(shù)版本即可。另一種不易察覺的問題是遞歸展開的每一次實例化都會在二進制里產(chǎn)生一個真實存在的函數(shù)符號參數(shù)多、調用頻繁時二進制膨脹和編譯時間上漲都能感覺到。如果對編譯期性能敏感盡快考慮C17的折疊表達式或者C11下的逗號表達式展開方案。7.4 移動語義相關坑移動之后的源對象問題我在代碼評審時看到過的錯誤包括移動后直接使用源對象的成員沒檢查空指針、移動賦值之前沒有釋放原資源造成泄漏、移動構造函數(shù)忘了noexcept導致 vector 擴容時退化為拷貝、以及無代價地把一個左值std::move進一個馬上還要用的地方。針對這些比較實際的規(guī)約是移動構造函數(shù)和移動賦值必須標注noexcept否則標準庫容器擴容時可能會改用拷貝而不是移動性能收益直接歸零。移動后的源對象要約定“視為懸空”除了重新賦值和析構不要讀它的成員。std::move不是“強制搬移”它只是把左值標記成“可供搬移”。最終是否搬移取決于目標類型有沒有移動構造/移動賦值。7.5 function/bind的坑std::bind與std::function組合的坑通常出現(xiàn)在捕獲生命周期上。由于 bind 在存儲被綁定參數(shù)時默認按值因此如果你在函數(shù)里 bind 了一個局部變量并把這個綁定器存到全局局部變量雖然已經(jīng)銷毀但 bind 內部保存的副本還在——這其實是安全的。真正不安全的是綁定了一個std::ref(localVar)因為那保存的是真實引用如果局部變量沒了引用就懸空。這種懸空與lambda引用捕獲懸空是同一個本質問題。排查引用懸空類bug時優(yōu)先懷疑兩處lambda的[]/[var]捕獲以及 bind 里的std::ref。另外一個容易被忽略的點是std::function的賦值與默認狀態(tài)。未賦值的std::function是空的調用它時拋std::bad_function_call。在多線程回調注冊場景里先判斷if (handler)再做調用是必要的防御但真正安全的長效方案是在回調注冊/注銷時加鎖管理避免同一個handler在執(zhí)行中被另一個線程替換或清空。8. 個人經(jīng)驗這幾個特性組合起來才是真香單獨看列表初始化、移動語義、可變參數(shù)模板、lambda、function、bind每個都是“獨立的新語法”但在實際工程里它們經(jīng)常是擰在一起用的。我在寫一個輕量級的消息總線模塊時這種合力體現(xiàn)得最明顯消息總線的注冊接口需要支持各種類型的事件處理器。事件處理器的類型不一樣有的是普通函數(shù)有的是成員函數(shù)有的是lambda怎么辦用std::function統(tǒng)一存儲配合bind把成員函數(shù)轉成std::function配合lambda捕獲業(yè)務上下文。事件對象的構造用列表初始化加可變參數(shù)模板一條消息的參數(shù)可以全部打包進一個對象。消息發(fā)送時用移動語義把消息對象直接交給下一個模塊避免大數(shù)據(jù)拷貝。整套代碼下來比起以前C98的實現(xiàn)既簡短又清晰性能還更好。如果非要說一個最值得優(yōu)先掌握的組合我建議把“l(fā)ambda std::function 移動語義”這組先練熟。它們能覆蓋日常80%的回調與策略場景而且思考方式可以遷移到C14、C17甚至C20的后續(xù)特性上??勺儏?shù)模板和完美轉發(fā)屬于模板庫作者級能力學習曲線稍微陡一點但理解了“編譯期參數(shù)打包/拆包”這個模型之后再去看std::tuple、std::make_unique這些標準庫實現(xiàn)的源碼會有豁然開朗的感覺。我自己的經(jīng)驗里還有一個很實際的小技巧在調試模板相關的問題時編譯錯誤信息通常特別長千萬別從上往下掃直接翻到最底部的note:或者error:那一行往往才是真正的錯誤源頭。配合這些新特性時代碼風格上建議定義一套固定寫法初始化盡量用花括號移動構造/移動賦值寫noexceptlambda捕獲值顯式寫出function作為回調類型統(tǒng)一用別名。時間久了你會發(fā)現(xiàn)這批特性不光是語法糖它們確實讓C代碼寫起來更接近“描述意圖”而不是“描述每一步操作”這也是C11最大的價值所在。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
丁香五月婷婷啪啪| 丁香激情婷婷网| 天天做天天爱天天日| 日韩欧美老妇性视频91久久久| 91综合在线视频| 青青草原亚洲天堂| 玖操97| 99热的无码| 五月天婷婷久久视频| 亚洲av成人在线| 中文字幕AV在线播放| 九九热最新| 国外亚洲成AV人片在线观看 | 天天爽夜夜爽夜爽精品| 14色综合婷婷| 国产又色又爽又黄又免费| Www.se.久久| 9久久久久久久久久久| 婷婷五月综合婷婷| www.激情五月| 国产又黄又爽又色的免费| 综合在线观看99| www.久久久久久| 婷婷在线视频| 色色色色色网| 少妇2做爰HD韩国电影| www网站在线观看| 全高清无码视頻| 久久婷婷五月天激情新地址| 啪啪99| 九九激情网| 我爱婷婷五月天综合88| 色婷婷伊人| 成人国产欧美大片一区| 中文在线成人| 丁香5月综合啪啪| 天天狠狠色| 狠狠干综合网| 九九九九九九热| AV操逼网| 五月婷婷六月丁香色| 色色五月婷| 日本精品人妻无码77777| 久艹伊| 五月色婷婷亚洲| 桔色成人在线| 成人做爰高潮A片免费视频| 4399欧美另类视频| 色婷婷综合五月| 日韩视频99| 深爱激情综合| 97在线/亚洲| 99热99这里有免费的精品| 波多野结衣AV无码Porn| 极品五月天| 男人天堂AV在线一区二区| 深爱五月婷婷开心中文字幕| 色婷婷www| 欧美色五月| 激情婷婷五月在线合集| 中国AV性爱观看| 天天操夜夜操| 精品一区二区三区三区| 婷婷五月天亚洲精品| 亚洲综合网 665566| 9热在线| 日日爱678| 99精品免费欧美小视频 | 久久综合五月天| 八戒青柠影视剧在线观看| 超碰91人人操| 五月激情六月丁香| 色九月丁香婷婷蜜桃在线观看| 激情五月第四色| 久久超视频| 婷婷中文字幕网站| 日韩五月天婷婷| 日韩婷婷| 91人人操人人| 狠狠爱婷婷爱| 久久亚洲无码| 丁香婷婷老司机久操| 婷婷5月开心6月| 碰碰91| 久久一伦| 天天日天天摸| 天天综合网~91| www.99热. com这里只有精品| 夜夜爽天天爽| 99热 这里只有精品 国产 日韩| 亚洲午夜一区二区| 天天婬色综合| 婷婷五月天激情亚洲小说| 色五月综合在线| 99ri6在线视频| 日日夜夜青青草| 欧美婷婷| 秋霞电影一级黄| 色丁香影院| 99热热热99精品丁香| 久久综合这里只有精品1| 午夜色婷婷| 色玖玖综合| 五月丁香另类图片| www.五月天色色色| 久久资源网五月婷| 99色色爰| 五月婷婷基地| 再綫Av免费視品| 99热在线精品观看| 丁香婷婷五月天亚洲| 怡红院一二三| 色综合久久88| 婷婷色基地| 婷婷狠狠爱| 久久久人妻门| 亚洲蜜乳AV| 国产五月天激情小说| 99精品网| 开心五月综合激情综合五月| 色婷婷五月天| 天天狠狠色| 久久精品A片777777| 少妇日麻屄| www.婷婷| 久久这里只有国产精品视频| 婷婷综合伊人| 夜色综合网| 婷婷97碰碰| 五月婷婷婷婷| 91九色国产在线| 五月丁香六月婷婷无码| 91好好热日本在线| www.久久99| 99久久99视频只有精品| 亚洲妇女熟BBW| www.五月激情红色| 久久一级免费黄色片| 欧美婷婷成人| 丁香五月婷婷欧美激情-中文天堂最新版在线观看 | 五月婷婷和六月| 四川BBB搡BBB搡多人乱亂| 狠狠五月丁香色婷| 热婷婷av| 久久9久| 丁香五月网络网络| 色色亚洲99com| 综合伊人狠狠| 色色五月天网站| 婷婷综合激情| 丁香五月婷婷精品视频| 99热九九九九| 色色色色色色色色五月先| 91丨九色丨高潮丰满日本| 丁香综合婷婷五月天| 日韩人妻无码精品| 专区无日本视频高清8| 欧美综合在线五月天色婷婷| 亚洲av成人电影在线观看| 丁香五月欧美色综合| 成人亚洲精品| 97日韩无套内| 在线另类视频| 五月丁香六月色婷婷| 日本久碰| 1024日韩| 亚洲欧美另类在线23p| 色涩影院六月丁香| 大香蕉AV在线| 强伦轩人妻一区二区电影| 99视频在线播放大全| 五月丁香啪啪| 久8色色| 啪啪色激情五月天| 九久9精品| 久热中文字幕在线线观看 | 996er热| 人妻丰满精品一区二区A片| 99色热综合| 色五月天丁香婷婷色| 婷婷色影院| 五月婷婷综合色拍| 99网址在线看| 91热在线观看视频| 99碰超| 九九国产精视频| 婷婷五月天天| 婷婷久久网| 久久人人人人妻| 精品人妻在线| 成人.在线日韩| 亚洲五月色| 五月久久五月激情| 色播激情婷婷| 欧美搡BBBBB摔BBBBB| 亚洲热热视频| 天天操夜夜玩!| 影视av久久久噜噜噜噜噜三级| 色婷婷成人做爰A片免费看网站| 99色免费视频| 五月天婷婷免费| 婷婷激情五月| 日韩成人AV在线播放| 婷婷五月天激情在线观看| 日本123区日韩欧美不卡在线看| 五月婷婷色影院| 丁香六月天婷婷在线| 91在线看片| 色色性爱视频| 久久人人九| 五月亭亭激情综合| 色欲久久综合| 人人干女人| 欧洲亚洲精品| 欧美电影在线观看| 免费在线a| 天天摸.天天mo| 7777久久亚洲中文字幕| 色五月婷婷久久| 日日操日日爽| 这里只有精品在线视频精品| 精品99在线| 在线综合亚洲欧美65| 五月丁香六月婷婷激情网| 伊人天天色| 99精品一二三四视频| 色婷婷中文| 色五月五月婷婷| 夜夜躁婷婷AV| 欧美狠狠地| 91色久| 综合久久伊人| 日本精品人妻无码77777| 99热日| 婷婷开心激情五月激情网| 五月色婷婷在线观看| 99热天堂| 探花搜索结果 - 黄上黄| 日本人人超碰| 日本婷婷五月天| 五月天婷婷爱| 国产婷婷综合| WWW.夜夜| 亚洲性爱99在线| 青青草原中文字幕| 婷婷激情中文综合| 五月香婷婷| 操b视频在线观看一区二区| 五月天色婷婷视频| 激情性爱五月天| 综合网网欲色| 成人精品网站在线观看| 大大香蕉综合在线| 开心色色五月天综合| 五月天婷婷基地| 91人人操人人| 久九色| 九九热视频在线观看| 第四色婷婷色五月| AⅤ色区| 这里只有精品,日韩视频| 九九精品在线视频观看| 色99欧洲色19| 午夜天堂一区人妻| 综合欧美五月婷婷| 欧美丰满熟妇BBB久久久| 996热| 人人爽天天爽| 久久草大香蕉| 国产精品18久久久| 久久久国产精品黄毛片 | 国产精品久久99| 麻豆雪千夏| 丁香九色不卡aaa | 免费国产视频| www.久久久.com| 79色色| 99久久免费精品| 同性gv国产精品一区二区| 婷婷 久综合| 五月丁香婷婷基地| 五月丁香激情综合啪| 亚洲精品视频在线| 久久激情综合| 九九热手机在线视频| 天天艹天天色| 亚洲激情.com| 色色热| 九九热99熟女| 99热手机在线精品| 日本欧美成人片AAAA| 日本人妻A片成人免费看片| 婷婷五月AV| 男人天堂99| 久久精品99| 26uuu欧美| 国产精品18久久久| 亚洲精品**不卡在线播he| 沈娜娜av| 欧美激情综合色综合啪啪五月| 九热...av| 九九热精品| 色婷婷导航| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 亚洲第一第二网站| 国产真实乱了老女人视频| 久久精品99国产精品日本| 精品国产乱码久久久久久免费| 97亚洲视频在线| 色99欧洲色19| 丁香五月激情月| 亚洲欧洲午夜成人精品av| 久热中文字幕| 丁香五月婷婷呀| 激情五月黄色小说| 色丁香婷婷| 五月激情天| 成人电影一区| 久久无码成人| 九九热婷婷| 久操热线| www.av骚货| 99视频激情四射| 五月天另类视频| 久久精品99国产精品日本| 久久久久久婷| 这里只有精品免费在线视频| 伊人狠狠操| 亚洲另类视频| 999热在线视频| 亚洲色99| 久久艹 五月天| 天色综合网| 日本波多野结衣视频| 91久久色| 激情五月网站| 97极品在线| 亚洲免费观看高清完整版AV线| 99视频久久| 丁香婷婷天堂| 伊人激情啪啪| 99免费视频在线观看爱| 人人播| 青青草免费公开视频| 亚洲午夜国产成人电影VA国产欧…| 日韩啪图| 99热国内| 99色中文| 亚洲精品一区中文字幕乱码| 三级三久久线久久99久目本WW| 色综久久久| 直接看的AV网站| 91精品久久久久| 97一区二区| 久久一级片| 五月婷婷色播视频| 亚洲无码色| 久久9视频| 超碰中文字幕在线| \\五月天婷婷激情| 五月婷婷婷丁香播| 成人在线99| 日本少妇AA一级特黄大片| 久久久色婷婷五月天| 天天干夜夜谢| 日韩黄色中文字幕| 久久色在线视频| 天天色视频| 思思热视频在线| 爱穴久久| 国产日批视频| 五月丁香自拍| 人操综合| 26uuuavcom| 黄色三级日本| 五月婷婷色白丝| 丁香无五月网| 丁香五月综合AV在线| 思思热视频在线观看| 99热最新国内| 色色色色色热| 婷婷99视频精品| www.韩日视频| 婷婷中文字幕版| 五月丁香六月婷综合成人综合| 麻豆123区| 岛国资源网| 操一区| 69人妻人人澡人人爽久久| 黄涩毛片| 激情av| 69精品人妻不卡视频| 天天碰天天插天天操| 丁香五月婷婷影院| 爆乳熟妇一区二区三区爆乳| 99精品在线| 五月丁香六月情| 久久九九热38| 日逼免费视频| 精品香蕉99久久久久网站| 丁香五月中文字幕| 五月婷婷色影院| 婷婷伊人綜合| 色五月激情| .精品久久久麻豆国产精品| 五月天色图| 婷婷五月天激情网| 亚洲亚洲人成综合网络| 九九视频免费| 五月天色婷婷综合| 色婷婷WWW| 人人操AV| 99热精品网| 婷婷久久六月天| www狠狠| 色婷婷偷拍| 五月丁香综合激情| 99啪99| 桔色成人在线| 五月婷婷精品视频| 亚洲五月停停| 色婷婷精品视频| 99视频网| 中文字幕无码成人电影| 日本丁香五月| 五月丁香久人妻中文| 久色| 五月天AV大香蕉| 日韩无码色色| 丁香五月天激情四射网| 99a级片| 99狠狠| 色婷婷五月在线| 婷婷五月色综合| 狠狠色丁香婷婷久久综合| 超碰国产在线观看| 91久久综合亚洲鲁鲁五月天| 久久婷婷五月综合色奶水99啪| 丁香五月成人婷婷| 色琪琪一综合久久激情五月视频| 在线成人网站| 热99精品视频在线观看| 国产亚洲精品久久久久久郑州| 五月丁香激情综合啪啪| 五月天综合在线| 欧美在线操| 久99| 五月婷婷成人w| 国产午夜精品AV一区二区麻豆| 69热在线| 国产婷婷色综合AV蜜臀AV| 九九国产精视频| 色综合色色| 97色五月天| 乱精品一区字幕二区| 丁香五月天欧美在线| 夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂亚洲亚洲亚洲亚洲亚洲亚洲亚洲亚洲色 | 五月婷六月| 色月九九| 色婷婷综合亚洲| 97在线碰| 五月婷色| 精品九九视频| 久久机热探花| 丁香六月综合激情| 日日噜人人人做人| 激情综合网激情五月婷婷| 九九在线这里只有精品视频| 91色综合网| 久久538| 99 热国产在| 少妇被下春药玩弄A片| 五月丁香婷婷激情澎湃四射| 久久九九中文字幕| 97综合在线| 亚洲激情四射| 色五月 婷婷, 大香蕉| 天天色综网| 91制片厂久久久国产电影| 婷婷五月影院| 夜夜涩涩涩| 超碰国产一区| 九九激情综合| 色婷婷激情五月天在线观看| 久久五月天视频| 狠狠精品干练久久久无码中文字幕| 久色国产| 亚洲无码播放| 久久大国产香蕉| 激情六月天| 五月丁香综合激情在线观看| 五月天激情日色在线| 亚洲第一综合| 婷婷五月天播| AV片在线观看| 狠狠狠狠狠狠狠狠| 婷婷五月天啪啪| 日本丁香久在线| 五月天精品| 99爱在线精品视频免费观看| 色婷婷综合久色AV五色最新| 色婷婷综合在线| 六月色婷婷| 毛片新网地| 啪啪婷婷五月天激情| 亚洲丁香花色| 五月丁香六月激情综合| 97久久香草精品视频| 77777亚洲午夜久久| 1024人妻| 9l视频自拍9l九色9l成人| 另类图片五月天婷婷| 伊人婷婷五月天av| 久操婷婷| 永久免费一区二区三区| 天天爽天天爽夜夜爽| 一本久道综合99| 色呦精品| 日本久热| 99操逼| 在线91日韩| 五月丁香影院| 婷婷激情九月| 深爱激情婷| 综合99在线| 久久婷五月综合| 国产片色| 色五月综合网| 色射7856五月天激情四射| 99精彩视频| 久re热视频| 思思热久久婷婷五月天| 五月婷婷六月丁香激情深爱| 懂色av蜜臀av粉嫩av永陈冠希 | 色色色热| 丁香五月天激情网| 丁香五月天天日| ww久久| 久久aaaaa| 4399无码视频| 久久婷婷精品| 另类天堂| 欧美婷婷成人| 五月婷婷之美女图片| 熟女乱论网| 99狠狠色| 日本乱论99| 超碰cap| 婷婷五月天成人| 97在线视频人妻九色| 中文AV在线播放| 久热在线观看视频9| 影音先锋91在线资源站| 狠狠五月天| 日韩99视频| 欧洲激情精品婷婷| 思思久久99热只有频精品66| 襙逼网| WWW色五月天| 99热久久日本| 97人人操人人操人人操人人| 亚洲丁香婷婷| 碰超亚洲| 婷婷五月丁香青青草在线| 99热这里只有精品在线观看| 色婷婷丁香| 在线观看av网站| 这里只有精品无码| 色婷婷丁香五月天在线观看| 丁香久久| 婷婷五月天久久久| 26uuu欧美日本| 日日夜夜综合| 中国激情网| 久久婷婷亚洲五月天| 亚洲综合五月天综合| 丁香九月综合| 梁铮版蜘蛛女在线观看| 丁香亭亭久久| 五月婷婷激情四季| 婷婷色五月偷拍| 五月天婷亚洲天综合网综合 | 免费看欧美成人A片无码| 国产精品电影| 欧美成人精品三区综合A片 | 日韩在线观看亚洲| 99热亚洲| 婷婷五月天亚洲五码| 播五月丁香三月婷婷| 开心激情综合| 九九色色| 996er热| 97婷婷丁香五月| 先锋资源 996| 婷婷五月天成人网站| 五月丁香龟婷婷| 五月婷婷激情久久| 激情综合五月| 狠狠99| 操人久久| 九九aV| 99re思思| 可以直接看的av网站| 激情WWW| 日日夜夜爽爽| 99热这里只有精品首页| 六月综合在线| 综合久久综合久久| 天天操综合网| 91热视频色网站| 婷婷五月天综合网| 婷婷午夜综合| 9色在线| 久热99| 粉嫩AV久久一区二区三区| 五月丁香六月婷综合成人综合| 99热精品在线在线| 在线播放人妻| 另类视屏| 思思热国产视频| 日日婷婷不卡| 天天插综合| 成年人看Va免费视频| 五月婷婷六月色| 色婷婷久久| 丰满老熟妇BBBBB搡BBB| 亚洲AV成人精品网站在线播放| 一级七香蕉| 久一网站| 激情文学天天| 丁香五月成人在线| 操逼巨乳91| 丁香五月婷婷啪啪| 男人的天堂婷婷色五月| 免费看无码视频A级| 婷婷中文字幕| 欧美婷婷五月无砖| 日韩AAAAA| 这里只有精品免费视频| 色99最新网址| 在线观看的av| wwwxxx五月婷婷小说| 激情五月天小说网| 久热大香蕉| 欧美色片中文字幕久久久久| 超碰无码318604| 大香蕉五月天婷婷| 婷婷丁香五月天亚洲| www.99日本| 思思热在线| 亚洲精品白浆高清久久久久久| 色婷婷成人久久| 色综合中文色综合网| 丁香六月亚洲| 激情综合五月天| 色婷婷丁香五月| 久热天堂| 欧美在线骚货| 女人被男人吃奶到高潮| 六月婷婷色色色| 激情综合网激情五月天| 亚洲av无码精品色午夜| 这里只有视频精品| 九九成人| 操老逼综合网| 996热re视频精品视频| 99热这只有| 女人天堂AV| 可以免费观看的AV| 97色色综合| 99热这里只有精品96| 无码人妻激情| 日本97人人| 九九这里只有精品在线视频| 99精品视频免费观看| 99网| 无码橾| 激情婷婷五月天伊人在线观看| 思思国产99| 激情综合婷婷| 停停六月 综合| 激情五月综亚网| 五月婷婷色播| 五月天激情影院| 亚洲午夜一区二区| 色噜噜狠狠狠综合曰曰曰| 亚洲永久四色| 狠狠色综合久久久久| 99ri久久| 色色网站在线| 久99婷婷色综合| 九九这里只有精品在线视频| 欧美 日韩 成人| 99热精品在线观看| 久久久久久久久久8888| 五月天播播中文字幕| 99热热热99精品丁香| 一级黄色操B| AV美美午夜| 五月天综合网| 黄网在线免费播放| 俺去也在线官网| 99久久玖玖| 久re在线| 欧美激情综合色综合色| 国产毛片欧美毛片久久久| 亚洲另类电影| 狠狠人妻色综合| 99久久9| 亚洲综合久| 婷婷丁香五月综合免费视频百花| 五月婷久久综合| 综合视频五月| 国产人妻人伦精品一区二区| 色视频2025| 综合一区二区三区| 婷婷99丁香| 色婷婷久综合久久一本国产AV| 国产AV一区二区三区最新精品 | 日本va欧美va欧美va精品| AV色婷婷| 色综合激情图区| xxx综合在线| 午夜不卡久久精品无码免费| 99丁香五月婷| 超碰人人色| 國語久久婷| 婷婷九月亚洲| A在线观看| 五月天激情啪啪| 婷婷久久18| 五月婷婷开心五月| 性爱网六月丁香| 深爱五月激情| 99少妇精品| 性色五月天| .comwww在线观看免费操| 草逼大片| xxxx五月天色色| 无码任你操| 操逼五月天| 五月丁香啪啪综合| 风流少妇A片一区二区蜜桃| 婷婷亚洲天堂| 午夜大香蕉| 色婷婷狠狠| 另类激情综合| 亚洲激情网| 极品人妻VideOssS人妻| 色五月xxx| 色婷婷亚洲婷婷| 激情五月天啪啪| 99色在线视频| 亚洲丁香五月美女| 日韩欧美一级大黄网站| 无码se| 久久久97| 激情网战码亚洲A| 九热视频| 色色色色热热| 久婷婷五月激情| 可以免费观看的AV| 五月婷丁香花| 蜜臀AV在线观看| 久久这里只有国产精品视频| 日本成人内射| 人人草人人爱| 五月丁香婷婷久久| 欧美在线操| 九九成人精品免费视频| 无码99| 婷婷放心五日爱| 精国产品一区二区三区A片| 天天干天天 亚洲| 91亚洲视频| 久久婷婷五月综合啪| 99自拍网| 五月激情站| 色婷丨日丨天丨综合久久| 色啪久 | 噜噜五月天综合| 激情五月,激情综合网| 五月天啪啪| 久久9精品视频| 五月天婷婷基地| 六月天六月婷| 婷婷久久18| 九九视频这里只有精品| 性爱电影科技贸易有限公司| 无码一区二区三区四区五区91c| 激情图片婷婷| 狠狠88综合久久久久噜噜噜| 狠狠色中色| 日本天堂爱爱| 九九免费视频在线| 婷婷久久婷婷色五月| 人妻精品在线| 五月天婷婷丁香蜜桃91| aV直接看| 色在线99| 天天做天天爰天天爽天天无遮挡| 天堂婷婷综合| 俺去也五月天婷婷| 久操大香蕉| 精品夜夜澡人妻无码AV| 终合激情网| 亚卅毛片| 亚洲经典三级| 六月天婷婷| 玖月婷婷爱丁香| 久久视9精| 99riAv1国产在线观看| 99色看这里只有精品| 久久蜜臀婷婷| 五月婷婷开心网| 亚洲天天免费| 色婷婷91| 少妇人妻偷人精品无码视频新浪| 六月婷婷中文字幕| 激情久久五月天| 成人亚洲精品| 99热这里只有精品1998| 婷婷九月亚洲| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 色情五月丁香| 狠狠一日| 99视频内射三四| 99爱免费在线观看| 夜夜躁婷婷AV| 丁香五月天久久| www五月| 国产婷婷综合| 91丨九色丨熟女丰满| 九九成人| WWW.17C亚洲精品| 五月综合777| av国产精品偷| 182tv992tv人之初午夜免费观看| 婷婷在线免费| 亚洲成人婷婷| 人妻videos人妻高清| 丁香狠狠色婷婷| 岛国在线观看91| 色色丁香| 这里只有精品无码| 五月婷婷综合色拍| 婷婷久久综合久| 超碰色碰碰| 色婷婷丁香五月| 九九av在线| 国产精品扒开腿做爽爽爽A片唱戏 青青草国产亚洲精品久久 | 日本五月婷婷久久久六月丁香| 久婷久婷激情肉| 婷婷5月久久综合网站| 久久停停超碰| 激情五月天激情五月天| 色婷婷在线视频久| 激情综合五月天| 婷婷色色丁香| 欧美三级A做爰在线观看| www夜夜| 天天干天天色天天干| 99这里只有精品视频免费| 超碰在线94| 久久全意婷婷| 六月婷婷五月丁香| 婷婷五月天基地| 日日夜夜综合| 色五月天成人在线| 精品国产va久久久久| 9热视频在线观看| 日韩精品无码AV| 天天草女人| www.夜夜操| 成年人丁香五月| 婷婷五月天激情网| 丁香激情网| 玖玖资源站中文| 色噜噜在线| 99这里有精品久久97| www.97碰碰com| 婷婷五月色情| 色综合色综合色综合| 九色综合网| 欧类av怡春院| 另类小说五月天| 激情五月婷| 老司机伊人| www婷婷| 五月婷婷69| 欧美黄色AA片哗啦啦啦| 天天综合天综合| 五月婷婷综合色啪首页| 欧美激情丁香五月天久久婷婷一区| 色综合九九色综合88| 国产脫衣舞一区二区三区| 丁香五月大香蕉AV| 人人综合91网| 一级无码作爱片| 久久九九热re6这里有精品| 婷婷最新地址| 久久综合五月天激情小说网站| 久在线88综合| 中文字幕一色哟哟哟哟| 五月丁香综合激情| 99热在线观看| 亚洲国产精品SUV| 99热这里是精品| 五月天六月色| www.99在线| 婷婷色导航| 天天做天天爱| 国产成人精品亚洲线观看| 中文字幕人妻熟女在线| 国产精品人人做人人爽人人添| 丁香五月激情五月| 乱岳熟女50岁| 97日韩无套内| 香蕉综合网| 亚洲精品一区无码A片| 久久久99精品免费观看| 成人精品视频99在线观看免费| 欧美成人精品三区综合A片| 国产精品18久久久| 婷婷色婷婷| 日韩一区二区A片免费观看| 黑人无码一区| 中国AV性爱观看| 99久久99九九九99九他书对| 丁香婷婷六月天| 亚洲成人综合在线| 亚洲第一av| 91人人操人人爱| 色五月婷婷中文字幕| 丁香亭亭久久| 六月婷婷深深爱| 丁香婷婷五月激情四射网| 97亚洲精品| 91碰操| 日本天堂久久| 狠狠人妻色综合| 丁香五月影院| 成人欧美一区二区三区在线观看| 激情影院免费视频婷婷五月天| 国产精品激情五月天色婷婷| 五月天最新网| 任你爽精品免费视频6| 大香蕉久久| 国产精产国品一二三在观看| 超碰A V在线| 99日逼视频| 欧洲永久精品| 五月久久亚洲| 狠狠摸狠狠摸| 丁香婷婷色五月| AA片在线观看视频在线播放| 午夜激情四射影院| 色情五月天丁香社区| 国产中文亚洲欧美日韩性交| 五月婷婷精品视频| 五月婷婷在线视频| 婷婷 伊人 久久| 五月天开心网| 99日热在线视频| 丁香婷婷91在线观看视频| 久久婷婷影院| 亚洲激情视频网| 亭亭五月丁香五月天激情| 亚洲久热| 色婷五月天| 九九美女视频| 色九月国产| 天天日日人| 久久色五月天激情小说| 日日夜夜婷婷| 久久婷综| 99在线视频女女视频| 亚洲色婷婷色| 情趣视频66| 激情五月综合网| 黄网在线免费观| 99九九视频| 天天插天天草人人玩| 婷婷五月天小说网| 婷婷五月无码| 操精品9| 亚洲免费看片| 久久久久人妻中文| 五月婷婷日| 99国产精品久久久久久久久久久| 天堂久久大香蕉| 五月天开心激情网色欲无码| 十月色综合| 亚洲综合激情五月久久| 熟妇天天综合| 国产片天天爽夜夜爽| 婷婷五点亚洲| 婷婷色六月| 国精产品一区二区三区| 日韩砖区| 久草热视频在线观看| 激情五月天视频| 97日日碰碰| 九九九九九无码| 狠狠色大香蕉| 91男女视频在线观看| 99热久草| 五月停停丁香| 日韩无码色色| 亚洲成人丁香花| 色之综合网| 激情丁香五月| 激情小说五月天| 99色日本| 天天檫天天爽| 另类视频五月天| 久久婷婷亚洲无码一起| 99精品7| 婷婷五月天伊人网| 丁香五月综合首页| 激情五月综合色| 日日夜夜狠狠| 久综合4| 狠狠色狠狠干| 久久综合中文| 97操| 久久婷婷操| 日日操天天操| 亚洲成人中文字幕| 26uuuavcom| 久热无码| 超碰熟女农村在线69| 色五月xxx| 亚洲视频二区| 久久婷婷东京热大香樵| 婷激情五月| 婷婷久久综合| 激情啪啪五月| 五月天婷婷丁香社区| 精品一区二区三区四区五区六区| 丁香五月香蕉| 能看的av网站| 亚洲美女裸体被操在线观看| 久久大国产香蕉| 亚洲综合视频天天精品| 激情四射网| 91人人人人人| 丁香五月 综合| 婷婷伊人中文字幕| 操逼巨乳91| 婷婷五月综合亚洲| 久久看九九90| 色欲日日躁| 亚洲99综合| 爱iii做iiii日日| www.五月激情红色| 五月天婷婷综合| 激情六月下句是什么| 色色五月天激情| 日本97在线| 无套内射极品大美女| 婷婷五月综合网激情| 九九久久视频| 亚洲欧洲另类图片| 丁香五月亭亭六月综合激情网| 丁香婷婷六月| 五月天婷婷基地| 99热色精品| 黄色一极大片| 五月天四色房丁香亭亭| 日本色超碰| 久久A区B区| 9九九久久精品无码专区| 五月丁香婷婷激情在线| 欧洲第一无人区观看| 五月婷婷激情四季| 五月天色五月| 婷婷五月激情的图片| 色综合五月天| 九九热亚洲中文在线观看免费| 色色五月婷| 97色啪| 干一干xxxx| 超碰猛烈的性猛交| www.天天干| 九热免费视频| 九九综合色综合| 日韩超碰在线| 精品久久9| www.五月婷婷久久.com| 丁香婷婷大香蕉| 日韩亚洲视频| 一起草av| 涩涩五月天综合| 26uuu最新地址| 婷婷久久欧美| 激情深爱五月天| 可以免费观看的av网址| 久操热| 天天综合.com| 久久性爱99国产| 丁香五月六月久久综合| 五月丁香婷婷啪啪| 亚洲第一色色色色| 久久久人妻| 99精品在| 在线播放 精品| www.五月激情红色| 九九中文色色| 99久久这里只有精品| 久热久re| 色五月偷偷| 色播五月婷婷| 色色无码| 六月色国内综合| 色 噜噜 九月 婷婷| 99爱视频| 操97| 五月婷婷深深爱| 五月天久久www| 精品操逼一区二区| 五月婷婷 激情五月| 亚州综合色| 日本欧美在线| 色宗合,宗合网| 六月婷婷综合网2| 天天精品视频免费观看| 婷婷射丁香| 久操婷婷| 五月天激情日色在线| 亚洲成人av在线观看| 九色无码| 五月天激情黄色小说在线观看| 欧美成人va| 99久久精品网| 91热手机在线| 99精品一二三四视频| 色婷婷XXXXX| 亚洲春色奇米影视| 五月亭亭狠狠| 久久曰曰| 精品国产一区二区三区四区阿崩| 婷婷5月九九| 日韩欧美成人片| 国产成人网站在线观看| 深爱1激情网| 91色噜噜狠狠狠狠色综合| 日本色婷婷| 亚洲小视频| 成人一级片| 欧美激情性做爰免费视频| 婷婷色五月天在线| 婷婷五月激情网| 麻豆观看夏晴子| 色五月成人| 欧美激情 日韩无码 婷婷 五月天| 国产成人精品一区二三区熟女在线| 五月天 无码| 色婷婷五月开心六月综合| 一起草AV| 亚洲最大视频| site:hcxsz888.com| 无人区码一码二码三码医生系列| 人妻啪啪啪| 日日骑夜夜撸| 91高潮喷水久久久久久久久 | 中文在线成人| 日本黄 色 片| 激情五月天开心| 激情视频网址| 一本色道久久综合狠狠躁一二三 | 亚洲精品网站色视频| 欧美三级视频| 综合色色网| 午夜无码精品色综合久久| 99热国内精品| 天天揷综合网| 99久久久久| 六月丁香婷婷天堂| 婷婷综合一二三| 大伊香蕉精品视频在线| 狠狠爱五月婷婷| 国产综合激情五月久久| 日本性视频| 日本三级大片| 婷婷六月网| 日韩AV中文字幕在线| 九九视频这里只有精品| 可以免费看AV网站| 91视频一起草| 双性美人被调教到喷水A片| 婷婷十月丁香| 99开心五月五月丁香激情| se色婷婷视频| 五月天丁香成人社| 婷婷丁香基地在线| 色五月色图| 久久性视频| 亚色网站小视频| 日韩三级视频一区二区| 天天干天天做| 97人人操| 亚洲aV写真天天综合网久久| 人人干天天舔| 五月香蕉婷婷| 色婷婷很很丝袜| 亚洲综合激情五月久久| 99视频在线精品免费观看2| 无码一区二区三区四区五区| 99黄色在线视频精品熟女| 68热超碰在线| 天天干天天做| Av九九| 九九精品视频在线观看| 丁香五月成人论坛| 91精品婷婷国产综合久久| AA丁香综合激情| 九色91视频| 激情五月天小说| 久久午夜理论| 人人爽天天莫| 中文字幕欧美精品久久| 日曰躁夜夜躁2026| 99热综合| 日韩无码成人电影| 婷婷五月天在线视频网站| 色丁香综合影院| 国产成人网| 五月丁香黄色| 久热伊人9| 久久99激情五月天| 日韩性爱AV| 五月天激情小说| 我爱大香蕉| 99热日| 中文字幕久久一区二区三区| 婷婷五月开心中文字幕色| 婷婷激情中文综合| 欧美一级a | 五月天激情小说婷婷| 中文字幕av在线| 日本免费91| 热久69| 久久99免费视频| 国模狼狼| 亚洲色就是色色色| 99国产精品久久久久久久久久久| 日韩无码色色| 久久久WWW| 国产性爱一级| 亚洲美女网Va| 亚州操人在线视频| 婷婷激情区| 亚洲人成网亚洲欧洲无码久久| 五月婷婷九| 色婷婷丁香花五月天| 国产精品久久久久久久久久| 91九色国产| 丁香六月婷婷| 色综合色综合网| 人妻操在线看| 中文网av| 婷婷五月天激情影片| 激情五月婷婷在线区| 色综合爱综合| 色婷婷电影|