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

ARTICLE DETAIL

資訊詳情

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

C++享元模式實(shí)戰(zhàn):內(nèi)存優(yōu)化、狀態(tài)拆分與工廠緩存設(shè)計(jì)

C++享元模式實(shí)戰(zhàn):內(nèi)存優(yōu)化、狀態(tài)拆分與工廠緩存設(shè)計(jì) 前陣子接手一個(gè)C渲染項(xiàng)目粒子系統(tǒng)一開內(nèi)存蹭蹭往上飆八G的機(jī)器直接OOM。排查到最后罪魁禍?zhǔn)资且话偃f(wàn)個(gè)長(zhǎng)得幾乎一模一樣的粒子對(duì)象每個(gè)人都揣著一份紋理句柄和著色器參數(shù)。那一刻我意識(shí)到早該上享元模式Flyweight Pattern。這玩意兒不是教科書里那種可有可無(wú)的“形式主義抽象”它是實(shí)打?qū)嵞芫葍?nèi)存和性能的工程手段尤其C這種極度在意內(nèi)存布局和對(duì)象生命周期的語(yǔ)言享元模式用好了收益立竿見(jiàn)影。這篇文章我不打算重復(fù)教科書里那些概念定義我想講的是為什么你需要它、怎么判斷哪些字段該共享、哪些必須獨(dú)立、工廠和緩存池怎么設(shè)計(jì)才穩(wěn)以及我實(shí)際踩過(guò)的坑。內(nèi)容適合已經(jīng)掌握C基礎(chǔ)語(yǔ)法、寫過(guò)一些中大型對(duì)象模型但還在琢磨怎么優(yōu)化多對(duì)象內(nèi)存開銷的開發(fā)者??赐昴阒辽倌茏约菏謱懸粋€(gè)線程安全、支持懶加載的享元工廠并且知道什么時(shí)候別碰這個(gè)模式。1. 什么場(chǎng)景下才值得動(dòng)用享元模式1.1 先做一次內(nèi)存賬本很多人一聽到設(shè)計(jì)模式就想著“套上去”但享元模式不是銀彈它解決的是非常具體的痛點(diǎn)大量同構(gòu)對(duì)象各自持有重復(fù)的高成本數(shù)據(jù)。我通常在動(dòng)手前先算一筆賬把每個(gè)對(duì)象拆成數(shù)據(jù)字段估算單對(duì)象體積再乘上預(yù)估實(shí)例數(shù)量。舉個(gè)例子客戶端渲染引擎里常見(jiàn)的實(shí)體類struct Entity { std::string name; // 平均64字節(jié)含堆內(nèi)存 TextureHandle tex; // 16字節(jié) ShaderParams shader; // 128字節(jié) float matrix[16]; // 64字節(jié) Vector3 position; // 12字節(jié) float scale, rotation; // 8字節(jié) };這里前三塊加起來(lái)的體積非常大但它們的值在一大群實(shí)體里往往是相同的——比如一千個(gè)金幣模型用的是同一張貼圖、同一套材質(zhì)參數(shù)。如果每個(gè)實(shí)體都復(fù)制一份貼圖句柄和材質(zhì)參數(shù)浪費(fèi)就是指數(shù)級(jí)的。用sizeof算一下假設(shè)單實(shí)體256字節(jié)一百萬(wàn)個(gè)實(shí)體就是256MB其中可共享的部分可能占了150MB以上。這就是享元模式出場(chǎng)的前提對(duì)象數(shù)量夠大、可共享數(shù)據(jù)占比夠高、成本差異夠明顯。1.2 為什么C尤其適合這一套C和Java、Python這類語(yǔ)言不一樣它沒(méi)有自動(dòng)的“對(duì)象頭輕量化”或“字符串駐留”兜底措施所有內(nèi)存都由你顯式掌控。這意味著共享的語(yǔ)義必須由程序員親手實(shí)現(xiàn)但反過(guò)來(lái)也意味著你能做得非常極致配合const成員、string_view、pmr::memory_resource這些工具共享對(duì)象可以被設(shè)計(jì)成只讀、連續(xù)、零拷貝性能上限極高。我個(gè)人體會(huì)最深的一點(diǎn)C的“值語(yǔ)義”天然是享元模式的敵人但也是它的放大器。敵人在于C程序員默認(rèn)會(huì)給每個(gè)對(duì)象都分配獨(dú)立的數(shù)據(jù)塊復(fù)制起來(lái)心安理得放大器在于如果你能用shared_ptrconst Flyweight這種句柄去替代對(duì)象里的原始數(shù)據(jù)字段那么所有讀寫共享數(shù)據(jù)的地方都能命中同一塊內(nèi)存緩存友好度和分配次數(shù)都大幅改善。2. 先拆狀態(tài)把共享和不共享的部分分干凈2.1 內(nèi)在狀態(tài)與外在狀態(tài)的判斷清單享元模式的一切都建立在狀態(tài)拆分上。這個(gè)拆分一旦做錯(cuò)后面代碼寫得再漂亮也白搭。我的經(jīng)驗(yàn)是拿到一個(gè)類先別急著寫工廠先把所有成員變量列出來(lái)逐個(gè)問(wèn)三個(gè)問(wèn)題這個(gè)字段描述的是“這個(gè)對(duì)象是什么”還是“這個(gè)對(duì)象現(xiàn)在在哪”如果把兩個(gè)實(shí)例的該字段互換它們還能正常工作嗎這個(gè)字段在對(duì)象生命周期里會(huì)發(fā)生變化嗎前兩個(gè)問(wèn)題用于區(qū)分內(nèi)外第三個(gè)問(wèn)題決定你能不能安全地共享。內(nèi)在狀態(tài)是對(duì)象的本質(zhì)屬性一旦確定就不再改變外在狀態(tài)是對(duì)象在具體場(chǎng)景中的上下文會(huì)頻繁變化。舉一個(gè)大家最容易理解的例子一棵樹的渲染。樹的頂點(diǎn)網(wǎng)格、貼圖、法線數(shù)據(jù)是“樹之所以是樹”的本質(zhì)屬于內(nèi)在狀態(tài)——你可以讓一千棵松樹共享同一份網(wǎng)格和貼圖。但每棵樹的坐標(biāo)、朝向、縮放、風(fēng)吹動(dòng)的彎曲程度都不一樣這些屬于外在狀態(tài)。如果把“位置”錯(cuò)誤地扔進(jìn)共享對(duì)象里那么所有站在那棵樹位置上的樹都會(huì)被拖過(guò)去亂成一鍋粥。2.2 可變性的鐵律內(nèi)在狀態(tài)必須是const這里有一條我踩過(guò)坑之后才徹底貫徹的鐵律所有內(nèi)在狀態(tài)設(shè)計(jì)成const成員在構(gòu)造函數(shù)里一次性初始化之后只允許讀取不允許修改。為什么這么嚴(yán)格因?yàn)楣蚕韺?duì)象被多方同時(shí)引用任何一方對(duì)內(nèi)部字段的修改都會(huì)立刻傳染給所有使用者。這種“幽靈式的全局狀態(tài)改動(dòng)”極難排查比普通數(shù)據(jù)競(jìng)爭(zhēng)還陰險(xiǎn)——用鎖都不好使因?yàn)槟氵B該在哪個(gè)鎖上防范都說(shuō)不清。class TreeModel { public: TreeModel(Mesh mesh, Texture tex) : mesh_(std::move(mesh)), tex_(std::move(tex)) {} const Mesh mesh() const { return mesh_; } const Texture texture() const { return tex_; } private: const Mesh mesh_; // 注意 const const Texture tex_; // 注意 const };實(shí)戰(zhàn)中我還會(huì)把可變的狀態(tài)從共享對(duì)象里徹底剔除只留下純粹的“數(shù)據(jù)資產(chǎn)”。如果你發(fā)現(xiàn)某個(gè)字段在設(shè)計(jì)階段就很想給它加 setter那大概率它屬于外在狀態(tài)把setter放在調(diào)用者那邊去。2.3 生活化類比同一個(gè)模板不同的人你可以把享元對(duì)象理解成“印章”印章本身的形狀、刻字、材質(zhì)是共享的不管是誰(shuí)拿它在哪個(gè)位置蓋印出來(lái)的內(nèi)容本質(zhì)都來(lái)自同一個(gè)物理印章。但蓋出來(lái)的印跡落在哪張紙上、什么顏色、按了多少下每張紙都不一樣。這個(gè)“印章”就是內(nèi)在狀態(tài)“印跡的位置”就是外在狀態(tài)。想清楚這個(gè)類比你就會(huì)發(fā)現(xiàn)生活中大量可以套用享元模式的場(chǎng)景樂(lè)高積木的模具、代碼里公共的配置項(xiàng)、渲染引擎里的字體字形本質(zhì)都是同一件事。3. 從工廠到緩存池共享實(shí)例的管理策略3.1 為什么不能直接new一個(gè)享元對(duì)象確定了哪些數(shù)據(jù)要共享接下來(lái)就要回答這些共享對(duì)象從哪來(lái)、怎么保證同一個(gè)數(shù)據(jù)源只存在一份實(shí)例最直接的答案是用享元工廠統(tǒng)一管理。讓外部代碼直接new TreeModel(...)是最危險(xiǎn)的設(shè)計(jì)因?yàn)闆](méi)人能保證兩個(gè)調(diào)用者不會(huì)各自創(chuàng)建一份相同的網(wǎng)格數(shù)據(jù)一來(lái)內(nèi)存沒(méi)省下來(lái)二來(lái)后續(xù)的緩存、引用計(jì)數(shù)、生命周期管理全都無(wú)從談起。所以我會(huì)定義一個(gè)FlyweightFactory它內(nèi)部的職責(zé)很簡(jiǎn)單接收“描述性鍵值”比如文件路徑、特徵值組合在緩存里查找是否已有相同鍵的共享對(duì)象命中則返回已有對(duì)象未命中則創(chuàng)建并存入緩存3.2 緩存用shared_ptr還是weak_ptr這是個(gè)策略問(wèn)題緩存的數(shù)據(jù)結(jié)構(gòu)我首推std::unordered_map鍵是能唯一描述內(nèi)在狀態(tài)的Key。至于值類型shared_ptr和weak_ptr各有各的適用場(chǎng)景。如果你用shared_ptr作為緩存值那么緩存里永遠(yuǎn)存著所有創(chuàng)建過(guò)的共享對(duì)象對(duì)象生命周期和進(jìn)程一樣長(zhǎng)。這在資源數(shù)量有限、訪問(wèn)頻繁的場(chǎng)景下沒(méi)問(wèn)題——紋理管理器就該這樣貼圖一旦加載留在內(nèi)存里隨時(shí)等復(fù)用。壞處是如果你的Key維度很多比如粒子的顏色組合有幾千種那么這些對(duì)象全會(huì)常駐內(nèi)存反而失控。我后來(lái)的處理思路是分場(chǎng)景對(duì)待長(zhǎng)生命周期、強(qiáng)復(fù)用紋理、字體、網(wǎng)格緩存直接持有shared_ptr用引用計(jì)數(shù)管理“還有人用”沒(méi)有換入換出策略。短生命周期、創(chuàng)建頻次低零部件、臨時(shí)特效配置緩存持有weak_ptr業(yè)務(wù)方持有shared_ptr。當(dāng)沒(méi)有外部使用者時(shí)緩存里的weak_ptr自動(dòng)失效下次需要時(shí)再重建。weak_ptr版本的關(guān)鍵點(diǎn)在于查找時(shí)要判斷是否expired并且要能處理“緩存中有對(duì)象但已失效”的中間態(tài)否則會(huì)出現(xiàn)明明找不到可用對(duì)象卻直接返回空指針的情況。下面是我在項(xiàng)目里用過(guò)的完整工廠骨架包含了共享鎖 二次檢查class TreeModelFactory { public: std::shared_ptrconst TreeModel get(const std::string assetPath) { { std::shared_lock lock(mutex_); auto it cache_.find(assetPath); if (it ! cache_.end()) { if (auto obj it-second.lock()) { return obj; // 緩存命中且還活著 } } } std::unique_lock lock(mutex_); // 二次檢查等待鎖期間可能已被其他線程寫入 auto it cache_.find(assetPath); if (it ! cache_.end()) { if (auto obj it-second.lock()) { return obj; } } auto model std::make_sharedconst TreeModel( loadMesh(assetPath), loadTexture(assetPath)); cache_[assetPath] model; return model; } private: mutable std::shared_mutex mutex_; std::unordered_mapstd::string, std::weak_ptrconst TreeModel cache_; };這里有兩個(gè)細(xì)節(jié)值得說(shuō)。第一我用std::shared_mutex而不是簡(jiǎn)單的std::mutex因?yàn)閷?duì)緩存的讀操作遠(yuǎn)多于寫操作共享鎖能保護(hù)并發(fā)的讀第二注意那個(gè)“二次檢查”分支線程A創(chuàng)建對(duì)象期間線程B可能已經(jīng)持鎖搶建了相同對(duì)象如果不檢查就再次make_shared就會(huì)產(chǎn)生兩個(gè)同鍵對(duì)象享元的“唯一性”就被破壞了。3.3 讓構(gòu)造函數(shù)私有化擋住不守規(guī)矩的調(diào)用者一個(gè)非常實(shí)用的小技巧讓享元類的構(gòu)造函數(shù)設(shè)為私有或僅工廠可見(jiàn)確保只有工廠能創(chuàng)建對(duì)象。C里我會(huì)用friend class TreeModelFactory或者提供一個(gè)私有的標(biāo)記結(jié)構(gòu)體構(gòu)造標(biāo)簽來(lái)做到這一點(diǎn)。這是“語(yǔ)法層面強(qiáng)制約定”的做法雖然麻煩一點(diǎn)但能預(yù)防后面接手代碼的同事直接make_sharedTreeModel繞過(guò)緩存。除了工廠函數(shù)本身我還會(huì)把加載IO的部分隔離出來(lái)比如上例的loadMesh和loadTexture。這樣做的理由是一次文件IO可能耗時(shí)幾十毫秒如果多個(gè)線程同時(shí)請(qǐng)求同一個(gè)資源這個(gè)開銷會(huì)被放大很多倍而把IO放在鎖外做可以大幅提升并發(fā)能力——雖然會(huì)有重復(fù)加載的窗口但比起持鎖做磁盤IO這點(diǎn)浪費(fèi)完全值得。4. 實(shí)戰(zhàn)案例三類最適合C的享元落地場(chǎng)景4.1 資源管理器紋理與網(wǎng)格的共享最經(jīng)典、最好理解的一類應(yīng)用就是圖形和游戲項(xiàng)目里的資源管理器。紋理、網(wǎng)格、材質(zhì)、著色器這些都是高成本、高復(fù)用、低變化的資產(chǎn)天生就是享元的獵物。我在一個(gè)2D橫版游戲項(xiàng)目里做過(guò)統(tǒng)計(jì)游戲里有100多種怪獸配置每種怪獸模型唯一但所有怪獸共享一張精靈圖集sprite atlas共享比例大概是30個(gè)貼圖文件對(duì)應(yīng)5000個(gè)活動(dòng)對(duì)象。改造前的寫法是每個(gè)對(duì)象加載一份貼圖數(shù)據(jù)5000個(gè)對(duì)象會(huì)有數(shù)千次IO和大量?jī)?nèi)存復(fù)制老機(jī)器直接卡死。改造后實(shí)體對(duì)象只持有一個(gè)“紋理句柄編號(hào)”真正的貼圖數(shù)據(jù)只保留30份。內(nèi)存節(jié)省非常直觀貼圖部分從數(shù)千份變成30份實(shí)體對(duì)象體積從原來(lái)的一兩百字節(jié)降到三四十字節(jié)。前端渲染性能的提升更是沒(méi)法只看內(nèi)存數(shù)字——共享貼圖意味著同一個(gè)批次里的CPU緩存命中率提高渲染時(shí)CPU密集型的那部分流程快了很多。4.2 文本渲染字形數(shù)據(jù)的駐留復(fù)用如果你做過(guò)文本渲染一定知道字形glyph數(shù)據(jù)有多貴。每個(gè)漢字字形輪廓可能有幾百個(gè)頂點(diǎn)加上hinting信息和紋理坐標(biāo)單個(gè)字形很容易超過(guò)2KB。一個(gè)界面里有幾百個(gè)漢字如果每個(gè)文本對(duì)象都復(fù)制一份它的字形數(shù)據(jù)那這個(gè)界面的內(nèi)存開銷會(huì)非??鋸?。用享元模式的話我們會(huì)把“字符編碼 字體 字號(hào)”組合成一個(gè)Key緩存對(duì)應(yīng)的字形輪廓數(shù)據(jù)。每個(gè)文本塊對(duì)象只保存一串“字符索引”到字形對(duì)象的引用而不是復(fù)制數(shù)據(jù)本身。對(duì)用戶來(lái)說(shuō)輸入再多的“你好世界”內(nèi)存里也永遠(yuǎn)只有一份“你”的字形。如果再疊加字符串駐留技巧把相同的文本內(nèi)容本身也緩存起來(lái)還能省掉一大塊字符串重復(fù)存儲(chǔ)。字體系統(tǒng)比較特殊的一點(diǎn)是字形對(duì)象本身不需要讓用戶感知到生命周期——字體文件加載后基本常駐內(nèi)存所以這種場(chǎng)景更適合用shared_ptr做強(qiáng)緩存不用擔(dān)心內(nèi)存泄漏之類的問(wèn)題因?yàn)樽煮w資源本身就有上限。4.3 連接配置與對(duì)象池的組合處理既想共享又想復(fù)用的難題第三個(gè)場(chǎng)景我給出的方案比較進(jìn)階因?yàn)樗严碓J胶屯耆煌某鼗夹g(shù)結(jié)合起來(lái)了。假設(shè)你在寫一個(gè)數(shù)據(jù)庫(kù)或消息隊(duì)列客戶端大量線程需要頻繁建立連接。這里的難點(diǎn)在于連接對(duì)象本身絕不是“不可變”的——它有讀緩沖區(qū)的狀態(tài)、有當(dāng)前的協(xié)議狀態(tài)、有網(wǎng)絡(luò)錯(cuò)誤標(biāo)志這些被池化復(fù)用時(shí)必須被清空和重置。所以連接對(duì)象不適合直接做成享元。但連接參數(shù)不一樣IP、端口、用戶名、數(shù)據(jù)庫(kù)名、超時(shí)時(shí)間、SSL配置這些是“描述性”的完全不變。我的做法是把連接參數(shù)做成享元對(duì)象常駐內(nèi)存然后用一個(gè)對(duì)象池保存實(shí)際的連接句柄。每次新請(qǐng)求到來(lái)時(shí)從池子里取出一個(gè)空閑連接順手從享元參數(shù)對(duì)象里讀取配置初始化它。這樣既避開了連接對(duì)象的可變狀態(tài)問(wèn)題又兼得享元對(duì)高成本參數(shù)的復(fù)用。用一句大白話總結(jié)享元管“配方”對(duì)象池管“器皿”。場(chǎng)景共享鍵Key共享的內(nèi)容典型收益紋理管理文件路徑解碼參數(shù)解碼后的像素?cái)?shù)據(jù)、GPU句柄內(nèi)存引用數(shù)量從“對(duì)象數(shù)”降到“資源數(shù)”字形駐留字體字符字號(hào)輪廓頂點(diǎn)、坐標(biāo)、紋理UV文檔渲染內(nèi)存降低一個(gè)數(shù)量級(jí)連接配置IP端口用戶名參數(shù)初始化連接所需的全部配置每個(gè)連接省掉重復(fù)配置構(gòu)造開銷消息/日志過(guò)濾等級(jí)正則規(guī)則編譯后的正則表達(dá)式避免每次使用時(shí)重復(fù)編譯正則4.4 一個(gè)容易忽略的收益對(duì)象構(gòu)造開銷的節(jié)省很多文章講享元模式都在強(qiáng)調(diào)內(nèi)存但實(shí)際上對(duì)象的構(gòu)造開銷和緩存性能同樣重要。創(chuàng)建對(duì)象不只是分配內(nèi)存還包括調(diào)構(gòu)造函數(shù)、初始化虛表、可能觸發(fā)IO或網(wǎng)絡(luò)請(qǐng)求。如果工廠緩存命中的比例高這些開銷會(huì)全部省掉。尤其是在高頻場(chǎng)景——每一幀創(chuàng)建和銷毀大量短生命周期粒子時(shí)享元 對(duì)象池組合能把“創(chuàng)建”簡(jiǎn)化為一次哈希查找這一點(diǎn)在性能分析里往往是實(shí)打?qū)嵤∠聛?lái)的幾個(gè)百分點(diǎn)。5. 高頻坑與排查實(shí)錄5.1 共享狀態(tài)被意外修改一個(gè)經(jīng)典事故我印象最深的一次線上事故發(fā)生在一次重構(gòu)后某個(gè)渲染對(duì)象的color字段本來(lái)是外在狀態(tài)結(jié)果重構(gòu)時(shí)被擺進(jìn)了享元對(duì)象的內(nèi)部數(shù)據(jù)區(qū)。當(dāng)時(shí)代碼里有個(gè)調(diào)色板功能剛開始只有少數(shù)用戶反映“改了A角色的顏色B角色也跟著變了”后來(lái)反饋越來(lái)越多才定位到所有角色其實(shí)共享了同一個(gè)著色器的內(nèi)部可變參數(shù)。這個(gè)問(wèn)題的根源就是內(nèi)部狀態(tài)不是const。從那以后我在設(shè)計(jì)享元類時(shí)強(qiáng)制把內(nèi)部分字段都標(biāo)const并且在 code review 里專門強(qiáng)調(diào)凡是需要 setter 的成員一律移到外部狀態(tài)中。假如你的編譯環(huán)境里 C 標(biāo)準(zhǔn)版本較老暫時(shí)沒(méi)法用簡(jiǎn)潔的const成員初始化套件也可以考慮把可變狀態(tài)用指針或句柄間接暴露并在訪問(wèn)時(shí)都經(jīng)過(guò)嚴(yán)格的互斥保護(hù)。5.2 緩存泄漏shared_ptr無(wú)罪有罪的是引用圖第二種高頻坑是資源管理器運(yùn)行一段時(shí)間后內(nèi)存只漲不降。排查下來(lái)發(fā)現(xiàn)緩存里存了shared_ptr而業(yè)務(wù)方拿到對(duì)象后又往某個(gè)全局容器里塞了一份強(qiáng)引用兩頭的強(qiáng)引用交纏在一起形成引用環(huán)。此時(shí)即便業(yè)務(wù)方已經(jīng)不再使用緩存和全局容器互相“續(xù)命”對(duì)象永遠(yuǎn)釋放不了。解法其實(shí)不難業(yè)務(wù)方的容器盡量使用弱引用語(yǔ)義或者讓緩存直接使用weak_ptr配合常駐所有者管理生命周期。復(fù)雜項(xiàng)目里我建議直接用weak_ptr做緩存值因?yàn)橐坏﹥?nèi)存異常上漲至少能通過(guò)弱引用語(yǔ)義迅速確認(rèn)問(wèn)題不在緩存?zhèn)取?.3 并發(fā)重復(fù)創(chuàng)建雙重檢查鎖定沒(méi)有想象中簡(jiǎn)單我見(jiàn)過(guò)不少代碼把雙重檢查鎖定寫錯(cuò)了最常見(jiàn)的問(wèn)題是在兩個(gè)鎖之間沒(méi)有重新查找緩存就重復(fù)make_shared。這會(huì)導(dǎo)致兩個(gè)線程各創(chuàng)建一個(gè)共享對(duì)象實(shí)例而這兩個(gè)實(shí)例雖然“鍵”相同內(nèi)存卻翻倍。你嘗不到享元模式的紅利還會(huì)在緩存命中率高于預(yù)期時(shí)栽跟頭。正確姿勢(shì)我在前面代碼里已經(jīng)演示了關(guān)鍵在于讀路徑加共享鎖寫路徑加獨(dú)占鎖加獨(dú)占鎖之后必須意識(shí)到可能有其他線程在等待鎖期間已經(jīng)完成寫入因此一定要二次查找。另外如果項(xiàng)目是C11之前的舊標(biāo)準(zhǔn)還沒(méi)有shared_mutex可以用經(jīng)典的讀寫鎖實(shí)現(xiàn)或加一個(gè)std::atomic_flag做快速路徑的標(biāo)記檢查。5.4 哈希表的無(wú)謂分配小心鍵類型帶來(lái)的附加開銷第三個(gè)不太起眼但實(shí)測(cè)很痛的問(wèn)題是鍵的設(shè)計(jì)。如果你的鍵是std::string但業(yè)務(wù)方常常拿string_view或const char*來(lái)查找那么在find()時(shí)會(huì)隱式構(gòu)造臨時(shí)std::string這就引入了一次堆分配。C20里可以用透明哈希解決struct StringHash { using is_transparent void; // 啟用透明查找 size_t operator()(std::string_view key) const noexcept { return std::hashstd::string_view{}(key); } };使用std::unordered_mapstd::string, value, StringHash, std::equal_to之后find可以直接接收const char*或string_view避免創(chuàng)建臨時(shí)字符串。這個(gè)優(yōu)化在每秒執(zhí)行上萬(wàn)次查找的服務(wù)器代碼里效果極其明顯。5.5 過(guò)度共享明明不能共享的東西強(qiáng)行共享最后一個(gè)我見(jiàn)得很多的坑是新人為了用模式而用模式。有些對(duì)象看似同構(gòu)但它的“內(nèi)部狀態(tài)”其實(shí)帶有上下文依賴比如依賴調(diào)用者的渲染管線狀態(tài)或者依賴攝像機(jī)的觀察角。強(qiáng)行把這種對(duì)象塞進(jìn)共享池你會(huì)發(fā)現(xiàn)所有實(shí)例的顯示結(jié)果互相干擾圖形亂得像GIF故障。判斷標(biāo)準(zhǔn)我在第2節(jié)已經(jīng)給了這里補(bǔ)充一個(gè)經(jīng)驗(yàn)法則如果共享前后你能找到哪怕一個(gè)場(chǎng)景讓兩個(gè)實(shí)例的行為產(chǎn)生預(yù)期外的差異那它就不適合共享。寧可錯(cuò)失一點(diǎn)優(yōu)化也不要做有害的抽象。5.6 問(wèn)題速查表癥狀根因排查方向內(nèi)存不斷上漲緩存強(qiáng)引用 業(yè)務(wù)方強(qiáng)引用成環(huán)檢查全局容器是否持強(qiáng)引用改為弱引用多個(gè)實(shí)例數(shù)據(jù)意外重復(fù)鎖內(nèi)未二次檢查加獨(dú)占鎖后重新find一個(gè)對(duì)象改了全部跟著變內(nèi)部狀態(tài)非const拆外內(nèi)外狀態(tài)內(nèi)部字段全部const查找耗時(shí)異常高鍵隱式轉(zhuǎn)換觸發(fā)臨時(shí)string啟用透明哈?;蛴米苑庋b鍵行為結(jié)果相互污染過(guò)度共享了帶上下文的狀態(tài)回歸狀態(tài)劃分把上下文字段移到外部6. 邊界與組合享元模式和對(duì)象池、單例怎么配合6.1 一次講清三個(gè)模式的邊界很多人搞混享元模式、對(duì)象池和單例我在這邊說(shuō)一個(gè)很糙但很有效的區(qū)分方式。單例模式解決的是“全局唯一入口”的問(wèn)題強(qiáng)調(diào)的是身份的唯一性比如日志器、配置中心。享元模式解決的是“重復(fù)內(nèi)容去重”的問(wèn)題強(qiáng)調(diào)的是內(nèi)容的可復(fù)用性比如紋理、字形。對(duì)象池解決的是“高頻創(chuàng)建銷毀”的問(wèn)題強(qiáng)調(diào)的是生命周期復(fù)用比如網(wǎng)絡(luò)連接、線程池。它們不僅不沖突還經(jīng)常需要配合使用。享元對(duì)象本身如果創(chuàng)建成本很高那它里面再套一層對(duì)象池也是常見(jiàn)設(shè)計(jì)。比如一個(gè)粒子系統(tǒng)里的共享材質(zhì)對(duì)象可以一次性Pool一整批然后讓多個(gè)粒子實(shí)例通過(guò)享元句柄引用同一批材質(zhì)。6.2 組合起來(lái)的實(shí)戰(zhàn)架構(gòu)移動(dòng)端小游戲的資源系統(tǒng)我這里給出一套實(shí)戰(zhàn)組合設(shè)計(jì)。移動(dòng)端小游戲?qū)?nèi)存極其敏感資源系統(tǒng)一定得復(fù)用再?gòu)?fù)用。底層用對(duì)象池管理Mesh和Texture的原始數(shù)據(jù)塊。中層用享元工廠管理“邏輯資源”鍵是文件路徑 參數(shù)值是一個(gè)輕量句柄這個(gè)句柄內(nèi)部指向?qū)ο蟪乩锏臄?shù)據(jù)塊。每個(gè)游戲?qū)嶓w持有的是若干個(gè)“句柄”而不是直接把數(shù)據(jù)copy進(jìn)來(lái)。這套架構(gòu)的好處是業(yè)務(wù)代碼完全感知不到數(shù)據(jù)和配置的去重過(guò)程。渲染引擎拿到句柄后能看到共享數(shù)據(jù)只加載一次而對(duì)象的生命周期由對(duì)象池統(tǒng)一回收。實(shí)際上許多商業(yè)引擎的材質(zhì)系統(tǒng)、UI系統(tǒng)和特效系統(tǒng)都是這么設(shè)計(jì)的只不過(guò)底層細(xì)節(jié)各不相同。6.3 配合現(xiàn)代C的極致玩法內(nèi)存池與緩存友好性如果你追求極致性能可以把享元對(duì)象放到一個(gè)連續(xù)的內(nèi)存塊里然后每個(gè)業(yè)務(wù)對(duì)象只保存一個(gè)索引而不是指針。這個(gè)打法比shared_ptr的緩存更省內(nèi)存因?yàn)橹羔槺旧硗ǔJ?字節(jié)換成4字節(jié)的uint32_t索引能省一半引用開銷而且數(shù)組數(shù)據(jù)天然就是CPU緩存友好的連續(xù)內(nèi)存——遍歷100萬(wàn)個(gè)粒子時(shí)共享的那份數(shù)據(jù)大概率常駐L2緩存。配合pmr::monotonic_buffer_resource或者自己寫個(gè)簡(jiǎn)單的arena分配器可以為共享對(duì)象分配一塊大的連續(xù)內(nèi)存所有make_shared都從這塊內(nèi)存取。這樣對(duì)象的創(chuàng)建幾乎零開銷內(nèi)存回收也可以一次性整塊釋放省去逐對(duì)象析構(gòu)的調(diào)零開銷。這已經(jīng)屬于C里比較進(jìn)階的內(nèi)存技巧但和享元模式組合起來(lái)效果非常驚人。6.4 什么時(shí)候堅(jiān)決別用享元模式最后必須潑一盆冷水。如果對(duì)象的數(shù)量本來(lái)就不大幾千個(gè)以內(nèi)或者可共享數(shù)據(jù)占比很低或者對(duì)象的“內(nèi)在狀態(tài)”幾乎每個(gè)實(shí)例都不同那么引入工廠和哈希表反而會(huì)帶來(lái)額外的查找開銷和代碼復(fù)雜度。我等價(jià)換算一下一次哈希查找大概耗幾十納秒而復(fù)制一份小體積的std::string可能只要幾個(gè)納秒。別為了省那點(diǎn)內(nèi)存賠上運(yùn)行時(shí)性能和維護(hù)成本。我個(gè)人在實(shí)際項(xiàng)目里的判斷標(biāo)準(zhǔn)非常簡(jiǎn)單先估算對(duì)象數(shù)量的上限和可共享數(shù)據(jù)的大小如果節(jié)省出來(lái)的內(nèi)存超過(guò)總工程內(nèi)存的20%才值得引入享元模式否則普通的多實(shí)例模型反而更簡(jiǎn)單可靠。這個(gè)閾值不是絕對(duì)的但能擋掉至少一半為用而用的過(guò)度設(shè)計(jì)。再分享一個(gè)擴(kuò)展方向如果你正在寫一個(gè)編譯器或解析器可以嘗試把享元和字符串駐留結(jié)合這樣能讓AST中的類型名、變量名共用同一份存儲(chǔ)配合自定義arena分配器整個(gè)編譯器的內(nèi)存占用能降低30%以上。我的建議是別把這個(gè)模式當(dāng)成面試題答案背下來(lái)而是把它當(dāng)成一把“內(nèi)存放大鏡”拿它去照你項(xiàng)目里那些看起來(lái)體積巨大、重復(fù)度又高的對(duì)象照出來(lái)一個(gè)就復(fù)用一層的價(jià)值。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
亚洲成人妻日韩在线| 99精品在线| 天天欧美欧美亚洲网| 亚洲精品 欧美精品| 国产无码成人无码| 亚洲黄色视频在线观看视频| 国产黄色剧情影片麻豆免费播放| 婷婷久久综合久| 性爱动态120秒| 国产天美欧美| 可以在线观看的黄色网址| 久久亚州精品成人Av无| 欧美亚洲丝袜美女电影| 日韩精品黄片免费观看| 精精品人妻一区二区三区| 人人操人人狠狠操| 又大又大又大又粗爽高潮观看| 在线啊v一区| 男人综合网| 性交一区二区在线播放| 人妻天天操天天爽视频免费| 加勒比99999| 日本三级久| 国产又色又爽又舒服的三级视频 | 内射黑丝袜| 精品无码不卡视频| 一级成人性爱| 曰韩操B| 久久精品国产亚洲5555| 精品人妻少妇| 人妻性爱一区二区| 日韩内| 水澄无码AV| 日韩一级久久毛片| 中文字幕丰满人妻日本| 亚洲av综合色区图片亚洲| 久久国语| 97久久综合网| 九九这里只有精品| 国产成人免费观看在线视频| 黄aaaaaaaaaaaaaaaaaa色网站| 久久婷婷电影网| 午夜啪| 热思思免费视频| 欧美区亚洲区偷拍区| 亚洲美女av无码| 亚洲人久久久网| 激情自拍 校园春色| 啪啪视频亚洲第一| 91人妻Pr| 日韩性色b| 日本精品一区三区| 国产精品网站www| 国内外色色色色色成人视频| 欧美性爱www免费版| 干少妇视频| 久久精品99久久久久久| 91精品国产91熟女| 97在线欧| 夜夜 中文视频rt| 四虎884a| 亚洲国产熟妇综合色专区| 九九热九九| A级片日韩欧美国产欧美视频精选观看| 麻豆黄站| 91日产欧美| 在线 制服丝袜中出 人妻| 国产精品自拍欧美在线| 黄网色一区二区三区四区精品| 欧美色性爱| 家庭乱伦麻豆| av爱爱爱| 欧美激情五月天| 手机在线看片免费人成视频| www超碰| 久久99视频| 日本熟女中文| 99xav| 91超碰碰在线| 玖玖爱影院| 亚洲欧洲自拍| 国产日韩无码一区二区三区久久区| 国产h小视频在线观看免费| 超碰在线人妻中文字幕| 日本天天色| 色哟哟国产精品免费网址| 亚洲激情综合| 人妻酒店出差被中出免费在线播放| 亚洲色图激情小说| 涩涩久久精品| 黄色无码高清黄色无码网站| 精品伊人久久久大香线蕉小说| 午夜一区二区三区国产| 色制服丝袜夫妻av一区| 欧美精品久久久久久久丰满| 五月丁香婷婷综合| 亚洲日韩黑丝| 野狼福利社区| 日本污ww视频网站| 亚洲经典啪啪| 日韩啪啪啪视频| 成人线上超碰| 日本肏逼视频在线观看| jiujiujiujingpin| 国产曰批免费观看久久久| 亚洲成人性爱网站在线播放| 亚洲色色探花| 99这里只有精品| 91男女| 三级网色| 91激情国产| 亚洲天堂中文字| 偷拍欧美激情| 日韩中文字幕精品一区在线| 亚洲 图片 综合91| 久久一区二区蜜桃| 家庭乱伦性爱av| 色阁阁AV综合网| 十八禁电影伊人网| 亚洲成A∨人影院在线欢看| 97精品97| 99久久精品国产高潮| 天天日天天操VV| 色悠久久久av| 国产精品69人妻无码久久久| 超碰538| 中字幕人妻一区二区三区| 强奸乱伦av电影| 国产少妇与亚洲av| 日本一区二区中文字幕久久| 九九九久千久久激情蜜桃在线看 | 亚洲欧美激情在线视频| 玖玖资源视频一区二区三区| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 狠久久| 亚欧高清v| 一二三区视频在线观看| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 九九九九免费高| 久久天天艹| 青青久操| 亚洲AV成人精品网站在AV| AV天天在线观看| 亚洲人妻久久| 深夜激情 | 国产60区。| 78操B| 99精品久久| 亚洲无992tv| 91美女在线视频| 日韩精品一二三| 夜夜嗨一区二区三区直播内容| WWW黄片COM| 天操天操夜操夜月月年年操操 | 一二三四免费视频| 97人人夜夜精品视频| 免费成人在线熟妇网| 亚洲国产成人精品无码专区| 美女诱惑久久| 啊啊啊不要好爽日韩无码一区| 伊人五月天激情| 男人的天堂VA| 99RE在线视频精品,这里只有精品| 亚洲囯产精品女人久久久| 麻豆a'v电影| 久久久久久久少妇| 久久人| 一区二区三区四区久久视1| 强奸乱伦资源| 性综合网| 老熟女天天操| 人人干人人搞人人摸| 黑白配性爱AV成| 女人妻一区| 日韩乱中文| 熟妇一区二区| 亚洲色图8| 91偷拍欧美亚洲| 97天天日| 蜜桃午夜视频一区二区| a片亚洲一本通视频| 99久久久99久久91熟女| 国产亚洲精品第一最新| 99热99在线播放激情| 伊人九九九| 1024午夜激情男人的天堂| 五月天色综合| 日韩乱伦视频| 免费强奸av| 日韩欧美大力操| 人人妻人人澡人人爽人人精品浪潮| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 日语五十路和六十路亚洲国产精品 | av网站国产主播在线| 天天躁狠狠躁av| 日韩超碰精品综合| 看黑人AV不卡| 91在线美女| 婷婷成人五月天| A 天堂在线观看视频| 国产无码高清操逼视频| 女沟厕偷窥piss小便| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 亚洲国产尤物yw在线观看| 欧美亚洲国产91在线| 天美传媒婬乱在| 葡萄牙性视频一二区| 视频在线97| 91久久精品美女高潮喷水| 超碰这里有精品| 国产噜噜噜噜噜久久久久久久久| 亚洲色资源| 欧美中文狠| 天天做天天爱天天爽AV| 欧美日综合| julia国产在线| 大香蕉一人| 午夜噜噜噜| 97在线/亚洲| 亚洲 欧美 日本 国内 首页| 91无码精品| 男人的天堂视频精品乱在线| 亚州男人天堂| 国产一级高清免费观看| 丁香五六月啪啪| 翔田千里Av在线| 精品午夜福利国产一区二区在线观看| 肉嘟嘟www视频在线观看高清| 亚洲国产尤物yw在线观看| 亚欧成人综合影院| 日本肉体xxxx裸交| 黑操B| AND人妻系列| 97免费视频网| 2017,超碰| 欧美激情专区| 国岛片视频| 国产成人综合网| 久九九九九九九热| 伊人综合色网| 伊人青青草久久| 美熟女逼导航AV操逼| 亚洲人妻久久久| 欧美懂色综合网| 小日子操bb在线看| 六月天婷婷| 青青草视频久久久久| 人妻少妇精品久久久| 久久久性爱| 久久国产逼| 丰满少妇乱子伦精品无| 国产精品九9| 91无摭挡| 国产精品69久久久久久久| 精精品人妻一区二区三区| 女性喷水高潮在线观看| 91在线精品| 成人影 天天操 亚洲| 久久m| 超碰97丝袜| 天天色,天天干,天天干| 天天日B狠狠操| 亚洲天堂日本| 立川理惠被中出无码| 日本色色色视频| 天天欧美色| 国产蜜臀在线| 7777奇米影视久久| 麻豆天美久久91| 国产精品午夜福利| 免費黃色視頻觀看一| 精品毛片av一区二区| 91粉嫩萝控精品福利网站_精品影音先锋国 | 一区二区三区 日韩欧美| 亚洲夜夜欢无码一区二区| 人妻一区久久二区三区色播| 久久久蜜桃臀无码视频| 婷婷五月天伊人| 精品一二三区女同| 眼镜人妻101.com| 欧美精品偷拍| 不卡中文字幕aⅴ在线| 国产自偷自拍一区| 狠久久| 成年女人黄网站| 国产美女精品| 免费日韩黄片| 日本不卡二三区| 婷婷丁香激情| 久久仑合| 天天精品| julia ann久久| 日本一级二级三级网站| 欧美综合777| 天天躁日日躁xxxxx| 中文字幕久久精品一区| 激情无码日韩| 亚洲的天堂网| 国产精品无码论坛| 久久精品成人| 无码色| 天天综合网在线91| 久久女人一区二区三区| 97极品无码| 老色69| 天天干天天舔| 麻豆精品三区视频| 日本色色网| 一区二区视频在看| 97色在线观看| 亚洲AV无码黄色强奸| 久久久精品视频欧州站| 北京专精特新企业招聘信息| 国产精品自拍视频| 亚州色站 日韩电影| 欧美大波激情xxxx| 色婷婷日韩精品一区二区三区| 色综合九九| 精品91日日夜夜超清资源| 97舔舔| 日韩性爱免费观看视频| 大但人体久久久久| 99久久com免费视频′| 超碰在线人人射| 亚洲性图91| 亚洲激情网| 69XX一中文字幕人妻91| 啊啊啊操死我了| 97干com| 日韩在线一区高清在线| 超碰吊日色| 91在线限制级| 一区在线国产播放| 五月天婷婷在线看| www.成人无码| 91撸色网 玖玖网 欧美| 五月婷婷激情| 亚洲欧美自拍偷拍| 国产三级在线现体验区| 国产美女高潮视频| 试看福利| 亚洲情色第一页| 色嗨嗨在线| 日韩欧美性爱电影在线观看| 精品人妻久久久久一区二区三区| 久久九九一区二区三区成人| 香蕉久久国产AV一区二区| 欧美美女自慰一区二区三区| 久久亚洲影院一区二区| 亚洲无码精品AV久久久| 偷拍片久久| 男人兔费天堂| 亚洲最大网站av| 亚洲码在线中文在线观看| 97久久久久久久久久| 五月天色电影| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 操久久久久久| av婷婷色婷婷色六月| 三男一女不戴套的A片| 色原狠狠天天天| 91国产美女丝袜足交精品视频| 我要看免费韩日黄片| 久久这里是精品| 伊人天天久久动态图| 91N综合网| 丁香7月婷婷| 九九九九九九成人| 亚洲自拍欧美国产首页网曝| 亚洲图片欧美制度| 高潮嗯啊性感美女久久久| 91久久久久久久久久久| 一区=区三区视频| 清柠毛片| 欧美色棕合| 亚洲 欧美 天天| 天天插天天干| 亚洲天堂中文字幕无码男同| 色爱综合网| 志村玲子视频一区二区| 无码9区| www.色99| 精品一区二区三区蜜桃臀赵总| 天天色综合天天操| 亚洲欧美日韩综合在线尤物 | 天天干一区二区| 日韩乱码Av| 蜜色网色哟哟| 韩日男人的天堂| 99精品热| 日韩亚洲97| 2020中文字幕在线| 欧美91变态| 一区二区三| 91久久久亚洲| 看大黄色大片原件| 日韩探花精品在线视频| 一区二区三区精品视频| 柠檬AV导航| 婷婷久久综合久| 992这里有精品| 亚洲棕合电彰| 精彩久久中文| 97色综合中文网| 日本一道在线播放高清| 美女尤物人人操| 欧亚免费视频| 欧美色图天堂网m| 国产熟女精品区| 嗯嗯啊啊啊好爽| 亚洲午夜未满十八勿入网站日本又色又爽又黄 | 久久久九九九九| 亚洲少妇免费视频\| 午夜传煤十二区精品| 亚洲色图欧美一区二区不卡| 伊人久久大香线蕉无码| 五月婷婷六月色| 天天日日日射| 超碰在线综合97| 欧美色亚洲| 久久久久亚洲AV无码专区少妇| 亚洲四虎熟女精品| 色九九九| 精品国产乱码久久久影院| 亚洲欧美综合| 中文字幕在线观看视频www| 秋霞蝌科网日本一区| 激情第四色| 青青草乱入乱欲视频在线观看| 美女黄色91| 久久免费99精品久久久久久| 日韩一级欧美一级在线观看| 91jk色拍| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 91在线|亚| 97久久国产亚洲精品超碰热| 四虎国产精品永久在线囯在线| 人妻在线视频| aaa淫乱视频| 久久久久久久| 日韩国产中文字幕| 60秒免费视频| 国产精品麻豆成人av| 婷婷久久久| 超碰视97中文| 日本操逼视频导航| 啊啊啊啊啊啊啊啊啊啊在线观看| 激情小说图片亚洲首页| 天天综合~91入口| 国产精品一二三| 国产精品 久久久精品一牛| 天天添天天干电影| 97久久综合网| 都市久久精品激情亚洲| 欧美久久久15P| 国产视频第二页| 国产 三级自拍| 丝袜亚洲91| 岛国福利在线精品播放| 亚洲91亚洲| 好色综合| 久久综合18p| 九九碰九九爱97超| 97超碰9| 91精品国产高清久久久久久,亚洲成人| 丝袜无码a片| 无码动漫av中文字幕| 亚洲成人碰碰| 97精品网| 情色五月天久久久| 五月天激情视频| 欧美色自拍| 国产99久久99热这里只有精品15 | 超碰人妻久久| 久久久蜜桃一区二区三区| 欧洲视频在线| 嗯嗯嗯好爽| 97色碰| 青青11操操操操操操操操| 神马久久午夜| 久久夜嗨| 强奸乱伦资源| 九九九一二三| 福利风月五月天影院| 强奸乱伦 亚洲一区| 欧美精品久久96人妻无码| 亚欧免费| 白嫩妹子国产骚| 亚洲成人免费在线| 日韩熟女精一区二区三区不卡| 夜夜嗨一区二区| 永久免费观看的毛片的网站| 日韩不卡码| 国内毛片国产专区二| 国产精品另类| 日韩天堂av电影在线观看| 欧洲欧美视频一区二区| 台湾佬中文娱乐网久久久久久久久久com| 人人摸人人叼| 久久久久夜夜夜夜| 亚洲日韩熟女人妻高清在线| 色色五月婷| 一级毛片电影免费看| 日本超碰97日韩精品人妻| 国产免a费看黄片在线| 四虎av在线| 热久久国产精品视频大陆精品| 3d成人精品一区二区| 欧美性第1页| 粘花网06av视频| 玖玖资源综合在线视频| 热99这里有精品综合久久 | 久热这里| 美国一区二区三区视频| 欧美高清91| 一牛一区二区三区久久| 超碰人人妻| 欧美黄色大片在线观看 | 立川理惠加勒比无码| 在线岛| 殴美色网| 国产十八禁视频| 色婷五月天| 手机在线视频国内精品| 日韩一级欧美一级国产一级台湾 | 88xx成人精品视频| 5252色欧美在线男人的天堂| 天天综合网久久ww| 99操视频| 脫衣舞一区二区三区| 久久国产乱子伦精品免费女,网站| 欧美午夜视频| 天天天肏屄欧美| 色综合色色| 午夜无码精品免费看性色| 男人天堂网站| 国产欧美另类久久久精品课程| 97频视在线| 亚洲黄日韩无码专区| 黑丝少妇| 一区二区激情国产熟女 | 亚洲少妇综合| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 91色堂| 久久久国产精品人妻丝袜| 97资源制服丝袜| 精品久久人妻成人网| 人妻啪| 我要去看2个日本美女.com曹逼| 大逼色网站| 欧美日韩亚洲国产中文永久天天看| 绯色AV粉色AV蜜臀AV| 大香蕉手机在线视频| 激情五月婷婷| 五月婷婷丁香| 蜜桃臀av在线观看| 91爽啪| 午夜精品久久久久久久男人的天堂| 手机看av网站在线看| 亚洲最新a在线观看| 多毛小伙内射老太婆| 天天操天天干一区二区 | 黄网色一区二区三区四区精品| 国产 日韩 欧美高清| 2018天天干在线视频| 影音先锋日本一区二区| 欧美日韩国产三级黄色| 操逼逼福利视频| 97任你吞精| 久热伊人| 啊啊啊啊啊在线观看网址 | 超碰久久草| 人妻素股| 综合少妇网| 天天噜| 免费精品国偷自产在线在线| 日本三级A片网站com| 日韩在线性爱免费视频| 丝袜美腿制服人妻二区中文字幕| 成人国产精品三级A片| 五月婷色| 欧美综合1性辶| 国产欧美成人精品| 久久精品女同亚洲女同13| 国产精品久久久午夜夜伦鲁鲁| 涩亚洲欧洲| 欧美+日产+中文| 久久永久无码人妻视频| 亚洲av综合色区图片亚洲| 1024人妻熟女一区二区三区| 色啪网| 美腿色图| 精品白丝一区| 欧美不卡五十路| 欧美老妇曰批的视频| 十八禁啪啦拍视频无遮挡| 2011国产精品| 青久久| 欧美综合亚洲综合| 嫩草一区二区在线观看| 夜夜肏2021| 情色五月天网| 91性色| 久久婷婷综合国际产色怕| 国产精品老熟女一区二区| 96国产污污污丝袜| 亚洲色图亚洲| A片三级无码| 免费农村成人少妇人妻Aa一区二区视频| 国产丸一视频| 精品欧美不卡在线播放| 久久久国产三级黄色片| 日韩钢筋无码高清啾啾啾| 欧美天天影院| 国产精品欧美日韩久久| 日本一二区免费| 欧洲亚洲人妻无码高清久久三区四区| 久久伊人亚洲AV无码网站| 色婷五月| 蜜臀av网址| 中文字幕精品一区二| 三级日本一区二区三区| 亚洲 图片 综合91| 色九九九九九九| 久热在线精品免费观看| 日韩A优精品在线观看| 五月婷婷久久综合| 偷拍综合亚洲| 操www| av婷婷色网| 国产传媒一区二区三区| 日韩成人大片在线观看| 日韩欧美中文字| 中文字幕五月婷婷免费| 97天天爽| 亚洲色人| 五月久久HDAV| 激情小说在线视频| 偷拍网站久久男女男| 好吊色综合| 激情网五月天| 日韩大香蕉AV影片| 91久久久久久| 国产白丝网站| 亚洲无码色| 亚洲欧美伦综合| av中文在线| www亚洲欧美| 极品色社| 三级日本一区二区三区| 亚洲91亚洲| 性久久久| 精国久久一区二区三区98| 国产熟女完整版中字| 蜜桃色院一区久久| 国产一级作爱毛片| 久艹视频在线| 亚洲精品男人的天堂| 久久午夜色播影院免费高清| 日本美女性生活久久久久久久| 日韩精品人妻| 久久一留热品黄| 自拍偷拍第26| 中文字幕AV片| 97在线欧洲| 亚射在线| 欧美精品日韩久久久九| 男人的天堂日本东京热| 国产综合永久精品日韩鬼片| 午夜操操操| 爽爽淫人网| 性色AV蜜色av色欲av| 99热在线不卡| 日韩乱伦影音先锋| 欧美激情亚洲| 天天影视综合网欧美精品| 私人尤物在线精品不卡| 亚洲国内精品成人不卡| 热九九精品| 91美女视频| 精品中文日韩字幕视频| AV综合中文字幕干| 青春草莓视频在线观看网址| 欧美大片天天看| 国产亚洲国产超碰| 91精品人妻偷情| 久草久日| 一区二区三区四区五区高清无码永久视频| 国产一进一出视频网站| 91亚洲欧美激情| 五月婷婷hd| 亚洲国产欧美中文永久| 人妻性爱一区二区| 热热色综合网| 中文字幕加勒比海高清无码免费视频 | www.久久制服糖| 操老熟女AV| 欧美一区二区在线资源| 肉嘟嘟www视频在线观看高清| 亚洲欧洲自拍| 熟妇一区,二区,三区。| 情色五月天久久久| 91久久久久久| 九月丁香综合网| 五月婷亚洲精品天堂| 免看60秒涩涩视频| 熟女一区二区三区| 国产av尤物| 亚洲Av无码成人精品国产| 一区二区三区男人的天堂| 色色丁香| 日本操逼视频导航| 亚洲啪啪综合?v一区综合精品区| 久久一留热品黄| 色色婷婷五月| 网页导航五月天免费一二三区| 97爱| 91亚洲欧美激情| 97视频在线观看网站| 97国伦国色| 伊人成人中文字幕久久网| 性爱乱伦一区| 老司机深夜影院18未满| 午夜福利无毒不卡| 免费中文综合精品| 日韩欧无码一区二区三区免费不卡| 久久华人网| 成人黄页| 久草精品视频| 中文字幕人乱码中文字的预防方法 | 激情小说图片亚洲首页| 日本媚薬中文字幕在线| 97国产中文| WWW美腿丝袜香蕉中文| 男人久久精品| 红桃视频高潮| 丝袜狠狠草尤物人妻av91| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 亚洲精品97p| 婷婷九月国产| 91精品少妇搡搡搡| 伊人9| 99re这里只有精品2| 国产三级中文字幕粉嫩| 丰满熟女人妻一区二区三五十一路| 九九九热精品| 久久是精品| 一二区在线观看视频| 夫妻AV网站| 国产嫩草精品A88AV| 老司机香蕉| 91日韩国产欧美亚洲另类精盘州至城都| 婷婷性网| 精品国产一区探花在线观看| 插入逼91| 欧美黄色大片在线观看| 围产精品一区二区三区视频播放| 久久香蕉综合一本到3atv| 午夜国产成人福利视频| 97久久久| 啊啊啊啊啊啊在线看| 久久伊人网视频一区二区三区| 日日夜夜国产综合| 粉嫩av一区二区三区四季| 亚洲在线A| 丁香九月婷婷| 国产9 9在线 | 亚洲| 日韩亚洲国产视频| 女人爽到高潮潮喷18禁网站| 欧美熟爽综合| 2017天天透天天通天天擦| 精品无人区麻豆乱码1区2区图片| 夜夜躁狠狠躁日日躁av| 91人精品妻入口| 爱av免费| 少妇诱惑视频| 亚洲综合草草| 久久夜夜| 强奸乱伦αv片| 夜夜爽77777| 97一区二区三区视频| 欧美欧美少妇| 伊人操你| 这里只有精品视频| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 国产精品青青草| 狠综合网| 一本久道久久综合狠狠爱一密臀精| 国产在线能看的你懂的| 精品毛片久久久精品毛片| 美女诱惑1区2区| 啊啊啊啊啊好舒服视频| 97亚洲欧美| 日韩av一级黄片| 人妻一区二区三区| 超碰久草| 色翁荡息又大又硬又粗又爽| 久久婷五月天| 天天综合麻豆视频| 国产一区二区三区高清视频| 凸凹视频在线观看| 日韩三级在线观看mp4| 天天综合青苹果| 久久免费精彩视频| 一区二区三区蜜桃成人撸久久东京热| 99热在线只有精品| 2019久久久久久久久福利| 四虎影视在线| 日日不卡av| 亞洲久久直播| 精品国产72| 精品国产乱码久久| 成人日韩欧美| AV色五月| 日韩乱伦影音先锋| 欧美亚洲一区二区久久久婷精品大包诱| 99999国产| 日韩AC| 青青草无码视频| 伊人久久在线视频观看| 特级大荫道BBwBBwBBW| 欧美不在线| 大香蕉啪啪网| 日韩在线观看AV| 手机在线看片免费人成视频| 亚洲男人的天堂网| 在线观看成人性爱免费小视频| 日韩伦理久 久久 清纯| 999综合网| 欧美日不卡| 校园春色 欧美| 婷婷色一区| 外站AV在线| 99亚亚热| 亚洲天堂男人天堂网| 亚殴在线| 精品熟女呻吟久久91| wwwss在线观看| 亚洲人妻五月丁香婷婷| 国产亚洲精品农村妇女| 男女打扑克高清网站| 久久久四区| 久久啊哟| www.99色| 91美女看B| 亚洲乱码国产乱码精网站| 亚洲国产亚洲天堂| 免费啪啪啪网站18岁| 人妻丰满熟妇av无码区蜜桃| 国模精品一区二区三区苹果色戒| 日本一卡二区在线| 久草婷婷| av激情亚洲五月天| 91九久| 2019天天干| 中文字幕91综合| 免费观看网黄| 激情婷婷黑人91| 国产欧美美女免费观看视频| 性爱Av免费| 欧美亚洲se91| 国产激情av女片自拍| 大香蕉手机在线| 成人婷婷丁香| 欧美日韩性爱电影在线| 亚洲色图综合网| 六月激情婷婷| 亚洲欧美成人网站AAA| 欧美视频第二页| 亚洲精品中文字幕一区在线视频| 99精品综合久久久久五月天| 婷婷香蕉欧美在线一区二区三区| 国产在线能看的你懂的| 欲女人妻性色av| 大香蕉啪啪啪| 中文字幕五月婷婷免费| 天天影视之亚洲综合网| 天无日色综合| 国产精品婬乱一级毛片彝族| 9精品久久久久| 欧美色图亚洲特色| 26uuu国产免费观看| 国产中出内射一区二区| 超碰97久久国| 少妇免费视频| 日本三级R| 国产欧美在线观看免费观看| 综合性视频99| 午夜精品99久久久久传媒| 色欲无码人妻日韩欧美精品| 男人的天堂99| 日韩精品怡红院| 女人的久久久| 日韩,欧美,中文在线| 欧美激情久操网| 小电影欧美91| 久久国语| 18一区二区三区| 久久伊人大香蕉| 十八禁av无码免费网站APP| 欧美96在线|欧| 欧美美女后入| 熟女一区二区| 五月天激情网图片| 亚洲第2页| 囯戸精品高潮呻吟旡码| 先锋女优在线观看视频| 亚洲drav色图| 精品一区二区三区四区女 | 久久九七| 熟妇熟女视频一区二区三区| 操逼操逼逼操操逼91| 97爱爱| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 亚洲精品三| 乱伦av麻豆| 三级三久久线久久99久目本WW| 日本影视久久免费| 美女啊啊啊啊啊啊| A片 AV一级在线播放观看免费| 日韩人妻无码不卡网站| 囯产精品强| 97超碰资源网| 欧美精品双插| 青青草久久一区网| 好淫网一二三视区| 成人贴图日韩欧美| 大香蕉伊人色偷偷在线| 9+1视频网址| 国产精品青草综合久久| 欧美人妻一区| 日韩乱伦影音先锋| 一区操逼日比视频| 丰满人妻无码一区二区三区| 中文字幕奈奈美被公侵犯| 国产精品日韩在线一区| 亚洲乱色熟女一区| 免费久久一级毛片大黄| 国产一区二区三区高清视频| 中文字幕av亚洲精品| 熟妇综合一区二区三区| 黄色视频高清无码网站| 蜜桃狠狠色伊人亚洲综合网站| 国产精品久久发布| 久久中文字幕在线观看| 久啪视频| 美女网站91| 日本东京热加勒比久久| 99e久久国产精品| 思思视频免费看网站| 欧美亚洲国产91在线| 精品国产91内射久久| 九九九精品美女| 国产97亚洲| 在线a亚洲视频播放在线| 亚洲在线网站| 久久久久免费看少妇A片特黄| 97人人夜夜精品视频| 男女激情黄色网址| 久久精品国产亚洲AV成人直播| 国产超碰| 2020视频1区2区3区| 精品人妻一区二区免费蜜桃| 精品人妻视频一区二区三区蜜桃视频| 美日韩一二三区| 欧美91色| 国产97在线 | 亚洲| 欧美v亚洲v综合v国产v妖精| 欧美一级国产一级| 日韩成人大片在线观看| 射 色综合| 黄资源| 亚州色图欧美色图| 男女啪啪网站免费视频| 国产亚洲精品美女久久久久久2021| 亚洲高清无码AAA久久久精品| 五月天婷婷色| 人妻无码久久一区二区三区免费| 亚洲AV色图一区| 国产真实子伦对白| AA特级绝黄| 夜夜夜久久| 综合性视频99| 亚洲 欧美 日韩 国产一区二区| 超97在线精品视频| 日本三级韩三级99久久| 97在线观视频免费观看| 九九九九九九九九九国产精品| 久久国产AⅤ| 97香蕉碰碰人妻国产欧美| 最新一二三区视频| 天天性射网| 黑人美精品 A片| 91 刺激在线| 77国产精品| 思思热一热婷婷热一热| 日本加勒比无码专区一二三| 97欧美超碰| 亚欧性爱ab| 久久精品老司| 久这精品中文在线观看视频| www.黄色在线| 亚洲不卡不卡中文字幕不卡 | 精品无码秘 人妻一区二区| 国产偷拍自拍在线视频| 97色欧州| 日韩大香蕉| 99无码视频| 欧美天天综合站| 97超碰磁| 欧美精品成人亚洲| 大逼色网站| A 天堂在线观看视频| 成人久久精品| 少妇被c 黄 免费观看| 天天干,夜夜爽| 天天天做天天天爱天天天爽| 最新岛国大片| 四季AV综合网址| 伊人天天久久动态图| 91九色在线| 999久久芭蕾| 伊人影院综合是一个与深夜成人在线| 丝袜综合| 国产一区二区三区高清视频| 嗯啊不要啊在线 | 五月天婷婷色色| 亚州Av天美传媒| 亚洲精品影视老司机| 久草新免费| 91人妻最真实刺激绿帽| 真实高潮91| 1769成人国产精品视频| 黄页大片在线观看| 精品在线蜜臀| 懂色AV一区二区三区| 美女91在线| 久久国产精品一级二级三级| 天天综合网在线91| 大香樵伊人网| 日韩无码一区二区三区| 嗯嗯嗯啊啊啊在线免费观看| 青青青青操国内视频在线| 欧美日韩青操| 日本欧美韩国国产在线| 夜精品久无码| 顶级丝袜熟女一区二区三区| 好爽免费视频,| 欧美日韩性爱操大逼| 欧美亚洲韩国视频十五区| 自拍鲍鱼一区在线高清观看免费| 九九人妻| 91碰碰| 亚洲欧美人妻| 久久久婷| 日韩美女操b| 激情文学亚洲| 亚洲午夜免费狠狠干| 日韩欧美亚洲自拍偷拍| 97青娱乐超碰久久| 综合操逼| 日韩欧视频| 九一屌逼| 美中日韩无码| 国产熟女一区二区| 嗯嗯啊啊用力视频免费| 免费一级精品啪啪视频| 伊人嫩草| 又黄又爽在线观看视频| 国产精品黑人一区二区三区| 久久久久ab| 91|九色|国产熟女| 青娱乐啪啪视频| 91国产美女丝袜足交精品视频| 国产成人无码高清| 精品人妻av区天天看片| 亚洲视频一二区| 国产精品亚洲一区二区三区四区| 亚洲色阁| 伊人伊人LD| 天天爽夜夜操| ,成人免费啪啪视频| 天天综合网亚洲综合网| 亚洲情色91| 26UUU欧美激情一区二区| 色噜噜日韩精品| 欧美日日夜夜| 亚洲Av无码成人精品国产| 中文久久久| 98福利在线视频| 国产精品老熟女一区二区| 人妻中文字幕精品无码| 97鸡把在线视频| 国内操逼视频二区| 大香蕉啪啪啪| 岛国片在线播放| v91av| 吉川爱美亚洲二区在线 | 加勒比色99999| 性色国产东北露脸精品视频| 丁香色色网| 强奸乱伦大香蕉| 蜜臀中文字幕| 欧美亚洲色的图| 75大香蕉| 亚州精人品大香蕉| 蜜乳av首页| 欧美性爱1080p| 超碰免费人妻人人| 99999国产| 精品人妻视频一区二区在线播放| 九九九久千久久激情蜜桃在线看 | 日本十八禁免费看污网站| 91成人无码| 女人18精品一区二区三区| 天美欧美国产| 欧美制服网站美腿丝袜| 一起草精品人妻| 免费观看国产小粉嫩喷水精品午| 亚州 综合 色图| 亚洲色图91欧美日韩| 日韩欧美字幕亚洲一区二区| 干我久操| 国产一级内射高清视频| 曰本道人妻久久久在线不卡色视频| 麻豆AV一区二区| 九九亚洲| 操逼日韩无码 | 婷婷五月天AV| 色欲蜜臀AV| 欧美一区二区三区四区综合| 国产美女高潮| 91人妻少妇| 酒色综合网| 丝袜足交视频| 欧美亚洲手机在线| 久久久久女教师免费一区| 九9精品| 天综合网欧美| 超碰97在线中文| 日日噜噜夜夜久久亚洲一区二区| 99www.bibizy香蕉资源国产一区二区三区高清 | 四虎精品亚洲| 色香网| 国产精选视频| 国产精品农村妇女| 久久国产乱子伦精品免费女,网站| 亚洲小说视频| v91av| 一起草三级AV电影在线观看 | 日韩欧美~中文字| 色欲久久99精品久久| 青青草中出视频| 国内一级精品| 色综91| 91福利网在线观看| 久久无码成人| 国产精品制服丝袜清纯唯美| 婷婷中文网| 男人天堂一区二区|