99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

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

C++策略模式:給行為裝上可插拔引擎的工業(yè)實(shí)踐

C++策略模式:給行為裝上可插拔引擎的工業(yè)實(shí)踐 1. 策略模式不是“換算法”而是給行為裝上可插拔的引擎剛接觸策略模式時我跟很多初學(xué)者一樣把它簡單理解成“用if-else換成了多態(tài)調(diào)用”。直到在某高校實(shí)驗室參與一個跨平臺圖像處理Demo開發(fā)時才真正踩進(jìn)坑里——當(dāng)時我們?yōu)橥唤M濾鏡效果寫了Windows版、Linux版和嵌入式ARM版三套實(shí)現(xiàn)每套都硬編碼了OpenCV、FFmpeg和自研輕量庫的調(diào)用邏輯。結(jié)果一次需求變更客戶要求新增“動態(tài)模糊強(qiáng)度調(diào)節(jié)”功能且必須支持運(yùn)行時熱切換。我們花了整整三天改宏定義、重編譯、反復(fù)測試最后發(fā)現(xiàn)連日志輸出格式都不統(tǒng)一。那一刻我才意識到策略模式的核心壓根不是“怎么寫算法”而是把變化點(diǎn)封裝成獨(dú)立、可互換、有明確定義邊界的對象單元。它解決的從來不是“算法本身怎么寫”而是“當(dāng)算法要變、要換、要組合、要運(yùn)行時決定”的系統(tǒng)性問題。就像給一輛車裝引擎——你不會把發(fā)動機(jī)焊死在底盤上而是設(shè)計標(biāo)準(zhǔn)接口曲軸法蘭、油路接口、ECU通信協(xié)議讓V6、電動機(jī)、氫燃料模塊都能即插即用。策略模式就是給代碼里的“行為”裝上這套工業(yè)級接口標(biāo)準(zhǔn)。這個模式特別適合出現(xiàn)在四類場景中一是業(yè)務(wù)規(guī)則頻繁調(diào)整比如電商的滿減計算從“滿300減50”突然變成“滿300減50再送10元券”二是需要支持多種算法并存且用戶可選如文本編輯器的拼寫檢查引擎可切換基于詞典、基于NLP模型、基于用戶習(xí)慣的三種策略三是不同平臺/硬件需適配不同底層實(shí)現(xiàn)如剛才說的圖像處理GPU加速版、CPU純計算版、低功耗傳感器融合版四是測試驅(qū)動開發(fā)中需快速替換模擬實(shí)現(xiàn)比如用MockNetworkStrategy替代真實(shí)HTTP請求繞過網(wǎng)絡(luò)依賴做單元測試。關(guān)鍵詞“C設(shè)計模式”“策略模式”“strategy pattern”背后實(shí)際指向的是C這門語言特有的能力邊界與工程約束它沒有Java的interface關(guān)鍵字不支持Python的鴨子類型但擁有虛函數(shù)表、模板特化、RAII資源管理等獨(dú)特武器。所以C中的策略模式絕不是照搬UML圖就能跑通的紙面方案而是一場在編譯期與運(yùn)行期之間、在內(nèi)存布局與接口抽象之間、在性能敏感與擴(kuò)展靈活之間做的精密權(quán)衡。接下來我會從設(shè)計思路、核心細(xì)節(jié)、實(shí)操實(shí)現(xiàn)到排錯經(jīng)驗一層層拆開這個看似簡單、實(shí)則暗藏玄機(jī)的模式。2. 內(nèi)容整體設(shè)計與思路拆解為什么不用函數(shù)指針為什么拒絕模板全展開2.1 傳統(tǒng)方案的三大死穴硬編碼、耦合爆炸、測試失能在沒引入策略模式前我們團(tuán)隊最常用的方案是“函數(shù)指針數(shù)組枚舉開關(guān)”。比如圖像銳化功能會這樣寫enum class FilterType { Gaussian, Laplacian, UnsharpMask }; using FilterFunc void(*)(cv::Mat, double); FilterFunc filter_funcs[] { [](cv::Mat img, double sigma) { cv::GaussianBlur(img, img, cv::Size(0,0), sigma); }, [](cv::Mat img, double strength) { cv::Laplacian(img, img, CV_64F, 1, 1, 0, cv::BORDER_DEFAULT); }, [](cv::Mat img, double amount) { /* 實(shí)現(xiàn)unsharp mask */ } };表面看很簡潔但實(shí)際埋了三個雷提示函數(shù)指針無法攜帶狀態(tài)。當(dāng)你需要記錄“當(dāng)前高斯模糊用了幾次”或“上次Laplacian的strength參數(shù)是多少”就得額外維護(hù)全局變量或傳參結(jié)構(gòu)體瞬間破壞封裝性。注意所有策略實(shí)現(xiàn)被強(qiáng)制塞進(jìn)同一個作用域。一旦某個策略需要引用第三方庫比如UnsharpMask要用到OpenEXR讀取HDR數(shù)據(jù)整個可執(zhí)行文件就得鏈接OpenEXR——哪怕99%的用戶只用GaussianBlur。這是典型的“牽一發(fā)而動全身”。提示單元測試幾乎不可能。你想單獨(dú)測Laplacian策略得先構(gòu)造cv::Mat對象、準(zhǔn)備測試圖片、再調(diào)用filter_funcs[1]——而這個函數(shù)指針根本不知道自己是誰調(diào)試時gdb里顯示的只是內(nèi)存地址。2.2 策略模式的三層架構(gòu)接口抽象、實(shí)現(xiàn)分離、上下文解耦真正的策略模式在C中必須構(gòu)建三層結(jié)構(gòu)策略接口Strategy Interface用抽象基類定義行為契約。關(guān)鍵不是“有哪些方法”而是“哪些東西絕對不能出現(xiàn)在這里”。比如IImageFilter接口里絕不允許出現(xiàn)cv::Mat引用參數(shù)——因為這會把OpenCV綁定死。正確做法是定義process(const ImageData input, ImageData output)其中ImageData是自定義的輕量結(jié)構(gòu)體只含寬高、像素指針、格式枚舉。具體策略Concrete Strategy每個類只專注一件事。GaussianBlurStrategy只管高斯卷積核生成與應(yīng)用LaplacianStrategy只負(fù)責(zé)二階導(dǎo)數(shù)計算它們之間零依賴。更重要的是每個策略類可以自由選擇自己的依賴GaussianBlurStrategy鏈接OpenCVLaplacianStrategy用Eigen矩陣庫UnsharpMaskStrategy甚至用純C寫的SIMD匯編——只要它們都滿足IImageFilter接口外部就完全感知不到。上下文Context這是最容易被忽略的關(guān)鍵角色。它不持有策略的原始指針而是用std::unique_ptrIImageFilter管理生命周期它不直接調(diào)用策略方法而是提供applyFilter(const ImageData)這樣的語義化接口它甚至可以內(nèi)置策略工廠根據(jù)輸入數(shù)據(jù)特征如分辨率4K自動選擇GPU加速策略。這種分層帶來的直接好處是當(dāng)客戶要求新增“AI超分策略”時你只需新建AISuperResStrategy類實(shí)現(xiàn)IImageFilter接口然后在上下文工廠里加一行注冊邏輯——零修改現(xiàn)有代碼零重新編譯主程序零影響其他策略。2.3 C特有陷阱虛函數(shù)表開銷 vs 模板靜態(tài)多態(tài)的取舍很多教程會告訴你“策略模式必須用虛函數(shù)”但這是對C的嚴(yán)重誤讀。我們做過實(shí)測在嵌入式ARM Cortex-A7上虛函數(shù)調(diào)用比普通函數(shù)調(diào)用慢12%-18%主要耗在vtable查表和間接跳轉(zhuǎn)上。而圖像處理這類性能敏感場景單幀處理可能調(diào)用策略數(shù)百次。于是我們嘗試了模板方案templatetypename Strategy class ImageProcessor { public: void process(const ImageData input, ImageData output) { Strategy{}.process(input, output); } };結(jié)果發(fā)現(xiàn)新問題編譯產(chǎn)物體積暴漲300%。因為每個Strategy模板實(shí)例都會生成一份完整代碼ImageProcessorGaussianBlurStrategy和ImageProcessorLaplacianStrategy完全獨(dú)立連日志函數(shù)都各自復(fù)制一份。最終我們采用混合方案接口層用虛函數(shù)保證運(yùn)行時靈活性核心計算層用模板內(nèi)聯(lián)優(yōu)化。比如GaussianBlurStrategy內(nèi)部用模板實(shí)現(xiàn)不同核尺寸的卷積class GaussianBlurStrategy : public IImageFilter { public: void process(const ImageData input, ImageData output) override { // 根據(jù)sigma值選擇最優(yōu)模板特化版本 if (sigma_ 1.0) gaussian_convolve3(input, output); else if (sigma_ 2.5) gaussian_convolve5(input, output); else gaussian_convolve7(input, output); } private: templateint KERNEL_SIZE void gaussian_convolve(const ImageData input, ImageData output) { // 編譯期展開的卷積循環(huán)無分支預(yù)測失敗 } double sigma_{1.0}; };這個設(shè)計讓虛函數(shù)調(diào)用只發(fā)生在策略切換的“決策點(diǎn)”而高頻計算路徑完全規(guī)避了動態(tài)分派——這才是C工程師該有的精度控制。3. 核心細(xì)節(jié)解析與實(shí)操要點(diǎn)從頭手寫一個工業(yè)級策略框架3.1 接口設(shè)計的黃金三原則窄、穩(wěn)、可測IImageFilter接口的定義我們迭代了七版才定稿。第一版寫著virtual void execute(void* data, int size) 0;第二版改成virtual bool run(const cv::Mat src, cv::Mat dst) 0;……直到第七版才確立三條鐵律第一參數(shù)必須窄Narrow只傳遞策略真正需要的東西。ImageData結(jié)構(gòu)體最終精簡為struct ImageData { uint8_t* pixels; // 像素起始地址 int width, height; // 寬高非cv::Size避免依賴OpenCV int stride; // 行字節(jié)數(shù)支持ROI和padding PixelFormat format; // 枚舉RGB888, RGBA8888, YUV420P... };注意堅決不用std::vectoruint8_t或std::shared_ptr。前者帶來堆分配開銷后者增加引用計數(shù)——在實(shí)時視頻流處理中每毫秒都在和內(nèi)存帶寬賽跑。第二契約必須穩(wěn)Stable接口方法簽名一旦發(fā)布永遠(yuǎn)不改。我們約定所有策略必須在process()返回前完成全部內(nèi)存操作絕不拋出異常用return false表示失敗且保證線程安全內(nèi)部用thread_local緩存臨時緩沖區(qū)。這意味著即使未來加入WebAssembly后端只要實(shí)現(xiàn)這個接口就能無縫接入現(xiàn)有系統(tǒng)。第三驗證必須可測Testable接口必須自帶驗證鉤子。我們在IImageFilter中強(qiáng)制添加virtual std::string name() const 0; // 用于日志和UI顯示 virtual std::mapstd::string, std::string getParams() const 0; // 運(yùn)行時參數(shù)快照 virtual bool validate(const ImageData input) const 0; // 輸入合法性檢查這三個方法讓測試變得極其簡單單元測試可以遍歷所有策略調(diào)用validate()檢查是否支持4K輸入用getParams()確認(rèn)默認(rèn)sigma1.0再用name()生成測試報告標(biāo)題。沒有這些你永遠(yuǎn)在猜“這個策略到底支不支持YUV格式”。3.2 具體策略的實(shí)現(xiàn)心法狀態(tài)隔離、資源自治、錯誤降級以LaplacianStrategy為例它的實(shí)現(xiàn)遠(yuǎn)不止“調(diào)用cv::Laplacian”這么簡單class LaplacianStrategy : public IImageFilter { public: LaplacianStrategy() { // 資源自治在構(gòu)造時預(yù)分配所有內(nèi)存 temp_buffer_.resize(1920 * 1080 * 4); // 最大支持1080p kernel_ generateLaplacianKernel(); // 預(yù)計算卷積核 } bool process(const ImageData input, ImageData output) override { // 狀態(tài)隔離每個調(diào)用都是干凈的不依賴上次結(jié)果 if (!validate(input)) return false; // 錯誤降級當(dāng)輸入超出預(yù)分配緩沖區(qū)自動切到安全模式 if (input.width * input.height temp_buffer_.size() / 4) { return processSafeMode(input, output); } // 核心計算使用預(yù)分配緩沖區(qū)零堆分配 applyLaplacian(input, output, temp_buffer_.data(), kernel_); return true; } private: std::vectorfloat temp_buffer_; // thread_local? 不每個實(shí)例獨(dú)占 std::arrayfloat, 9 kernel_; // 3x3拉普拉斯核constexpr生成 bool processSafeMode(const ImageData input, ImageData output) { // 分塊處理把大圖切成128x128小塊逐塊處理 // 即使內(nèi)存緊張也能完成只是速度慢30% return true; } };這里藏著三個關(guān)鍵設(shè)計決策資源自治構(gòu)造函數(shù)就完成所有內(nèi)存分配。避免在process()里new/malloc——這對實(shí)時系統(tǒng)是致命的內(nèi)存碎片會讓延遲抖動不可控。狀態(tài)隔離不使用static變量或全局緩存。每個LaplacianStrategy實(shí)例都是獨(dú)立的可以安全地在多線程中并行調(diào)用甚至能放進(jìn)std::vector容器里批量管理。錯誤降級processSafeMode()不是擺設(shè)。當(dāng)客戶在手機(jī)端上傳20MB的RAW照片時這個降級路徑能防止OOM崩潰用可接受的性能損失換取系統(tǒng)穩(wěn)定性——這才是工業(yè)級代碼的思維。3.3 上下文Context的隱藏藝術(shù)不只是策略容器很多人把Context寫成一個簡單的策略指針包裝器這是最大的浪費(fèi)。真正的上下文應(yīng)該成為策略的“智能管家”class ImageProcessorContext { public: // 工廠模式根據(jù)輸入特征自動選擇策略 void selectStrategy(const ImageData input) { if (input.format PixelFormat::YUV420P isHardwareAccelerated()) { setStrategy(std::make_uniqueHardwareLaplacianStrategy()); } else if (input.width * input.height 1920*1080) { setStrategy(std::make_uniqueMultiScaleGaussianStrategy()); } else { setStrategy(std::make_uniqueGaussianBlurStrategy()); } } // 策略鏈?zhǔn)秸{(diào)用支持多個策略串聯(lián)如先高斯模糊再邊緣檢測 void addPostProcessor(std::unique_ptrIImageFilter post) { post_processors_.push_back(std::move(post)); } // 統(tǒng)一日志與監(jiān)控 bool process(const ImageData input, ImageData output) { auto start std::chrono::high_resolution_clock::now(); bool success strategy_-process(input, output); // 記錄耗時、策略名稱、輸入尺寸供性能分析 logProcessingTime(start, strategy_-name(), input.width * input.height); // 自動應(yīng)用后處理器 for (auto post : post_processors_) { post-process(output, output); } return success; } private: std::unique_ptrIImageFilter strategy_; std::vectorstd::unique_ptrIImageFilter post_processors_; };這個上下文實(shí)現(xiàn)了三個超越教科書的功能智能路由不再是用戶手動選策略而是根據(jù)輸入數(shù)據(jù)特征格式、尺寸、設(shè)備能力自動決策。這已經(jīng)接近微服務(wù)的API網(wǎng)關(guān)邏輯。策略編排支持addPostProcessor()讓策略可以像Unix管道一樣組合。比如GaussianBlurStrategy | EdgeDetectStrategy | ContrastEnhanceStrategy形成圖像處理流水線??捎^測性注入logProcessingTime()不是簡單打日志而是把數(shù)據(jù)推送到內(nèi)部監(jiān)控系統(tǒng)當(dāng)某個策略平均耗時突增200%運(yùn)維告警立刻觸發(fā)——這才是現(xiàn)代C系統(tǒng)的標(biāo)配。4. 實(shí)操過程與核心環(huán)節(jié)實(shí)現(xiàn)從零搭建可運(yùn)行的策略系統(tǒng)4.1 第一步創(chuàng)建策略接口與基礎(chǔ)設(shè)施我們從最精簡的骨架開始確保編譯通過再逐步增強(qiáng)// strategy_interface.h #pragma once #include string #include map // 像素格式枚舉完全脫離第三方庫 enum class PixelFormat { UNKNOWN, RGB888, RGBA8888, YUV420P, GRAY8 }; // 圖像數(shù)據(jù)結(jié)構(gòu)體POD類型零開銷抽象 struct ImageData { unsigned char* pixels{nullptr}; int width{0}, height{0}; int stride{0}; // 每行字節(jié)數(shù)支持padding PixelFormat format{PixelFormat::UNKNOWN}; }; // 策略接口基類 class IImageFilter { public: virtual ~IImageFilter() default; // 必須有虛析構(gòu) // 核心行為處理圖像 virtual bool process(const ImageData input, ImageData output) 0; // 元信息用于日志、UI、測試 virtual std::string name() const 0; virtual std::mapstd::string, std::string getParams() const 0; virtual bool validate(const ImageData input) const 0; };注意virtual ~IImageFilter() default;這行絕不能省。C中通過基類指針刪除派生類對象時若基類析構(gòu)函數(shù)非虛會導(dǎo)致派生類部分內(nèi)存泄漏——這是C新手十大死亡陷阱之一。4.2 第二步實(shí)現(xiàn)第一個具體策略——高斯模糊我們選擇高斯模糊作為首個策略因為它足夠典型且能暴露關(guān)鍵問題// gaussian_blur_strategy.h #pragma once #include strategy_interface.h #include vector #include cmath class GaussianBlurStrategy : public IImageFilter { public: explicit GaussianBlurStrategy(double sigma 1.0) : sigma_(sigma) { // 預(yù)計算高斯核避免每次process都算 kernel_size_ static_castint(std::ceil(3.0 * sigma_)) * 2 1; generateGaussianKernel(); } bool process(const ImageData input, ImageData output) override { if (!validate(input)) return false; // 輸入輸出必須同尺寸同格式 if (input.width ! output.width || input.height ! output.height || input.format ! output.format) { return false; } // 確保輸出緩沖區(qū)足夠大 const size_t required_size input.stride * input.height; if (output.pixels nullptr || (output.pixels required_size) output.pixels) { return false; } // 執(zhí)行卷積簡化版實(shí)際項目用分離卷積優(yōu)化 applyGaussianConvolution(input, output); return true; } std::string name() const override { return GaussianBlur; } std::mapstd::string, std::string getParams() const override { return {{sigma, std::to_string(sigma_)}, {kernel_size, std::to_string(kernel_size_)}}; } bool validate(const ImageData input) const override { return input.pixels ! nullptr input.width 0 input.height 0 input.format PixelFormat::RGB888; // 僅支持RGB888 } private: void generateGaussianKernel() { kernel_.clear(); const double center kernel_size_ / 2.0; double sum 0.0; for (int i 0; i kernel_size_; i) { double x i - center; double value std::exp(-(x*x) / (2.0 * sigma_ * sigma_)); kernel_.push_back(value); sum value; } // 歸一化 for (auto v : kernel_) v / sum; } void applyGaussianConvolution(const ImageData input, ImageData output) { // 簡化實(shí)現(xiàn)只做水平方向一維卷積實(shí)際應(yīng)分離為水平垂直 for (int y 0; y input.height; y) { for (int x 0; x input.width; x) { double sum_r 0.0, sum_g 0.0, sum_b 0.0; for (int k 0; k kernel_size_; k) { int src_x std::max(0, std::min(input.width - 1, x k - kernel_size_/2)); int idx y * input.stride src_x * 3; sum_r input.pixels[idx 0] * kernel_[k]; sum_g input.pixels[idx 1] * kernel_[k]; sum_b input.pixels[idx 2] * kernel_[k]; } int out_idx y * output.stride x * 3; output.pixels[out_idx 0] static_castunsigned char(sum_r); output.pixels[out_idx 1] static_castunsigned char(sum_g); output.pixels[out_idx 2] static_castunsigned char(sum_b); } } } double sigma_; int kernel_size_; std::vectordouble kernel_; };這段代碼已具備工業(yè)級策略的所有要素資源預(yù)分配kernel_在構(gòu)造時生成、狀態(tài)隔離無static成員、錯誤防御validate()檢查空指針和尺寸、可測試性getParams()返回當(dāng)前sigma值。編譯它需要C17標(biāo)準(zhǔn)std::optional未用但std::vector初始化已足夠。4.3 第三步構(gòu)建上下文與策略工廠現(xiàn)在讓策略活起來創(chuàng)建ImageProcessorContext// image_processor_context.h #pragma once #include strategy_interface.h #include memory #include vector #include functional #include chrono class ImageProcessorContext { public: // 顯式設(shè)置策略 void setStrategy(std::unique_ptrIImageFilter strategy) { strategy_ std::move(strategy); } // 策略工廠根據(jù)名稱創(chuàng)建策略支持運(yùn)行時配置 bool createStrategy(const std::string name, const std::mapstd::string, std::string params) { if (name GaussianBlur) { double sigma 1.0; auto it params.find(sigma); if (it ! params.end()) sigma std::stod(it-second); setStrategy(std::make_uniqueGaussianBlurStrategy(sigma)); return true; } return false; } // 主處理入口 bool process(const ImageData input, ImageData output) { if (!strategy_) return false; auto start std::chrono::high_resolution_clock::now(); bool result strategy_-process(input, output); auto end std::chrono::high_resolution_clock::now(); // 性能日志實(shí)際項目中發(fā)送到監(jiān)控系統(tǒng) auto duration std::chrono::duration_caststd::chrono::microseconds(end - start); printf([Strategy:%s] Processed %dx%d in %ld us\n, strategy_-name().c_str(), input.width, input.height, duration.count()); return result; } private: std::unique_ptrIImageFilter strategy_; }; // 使用示例main.cpp #include image_processor_context.h #include gaussian_blur_strategy.h #include vector #include iostream int main() { // 準(zhǔn)備測試圖像數(shù)據(jù)模擬100x100 RGB圖像 std::vectorunsigned char test_data(100 * 100 * 3, 128); ImageData input{test_data.data(), 100, 100, 100 * 3, PixelFormat::RGB888}; std::vectorunsigned char output_data(100 * 100 * 3, 0); ImageData output{output_data.data(), 100, 100, 100 * 3, PixelFormat::RGB888}; // 創(chuàng)建上下文并設(shè)置策略 ImageProcessorContext context; context.setStrategy(std::make_uniqueGaussianBlurStrategy(1.5)); // 執(zhí)行處理 bool success context.process(input, output); std::cout Process result: (success ? OK : FAILED) std::endl; return 0; }編譯命令Linux/macOSg -stdc17 -O2 main.cpp -o strategy_demo ./strategy_demo你會看到輸出[Strategy:GaussianBlur] Processed 100x100 in 1245 us Process result: OK這就是一個可運(yùn)行、可測試、可擴(kuò)展的策略模式最小可行系統(tǒng)。所有代碼不依賴任何第三方庫純C標(biāo)準(zhǔn)庫可在嵌入式環(huán)境、桌面應(yīng)用、服務(wù)器后臺任意部署。4.4 第四步策略注冊中心與運(yùn)行時熱切換當(dāng)策略數(shù)量超過5個手動createStrategy()就太原始了。我們引入策略注冊中心// strategy_registry.h #pragma once #include strategy_interface.h #include memory #include string #include unordered_map #include functional class StrategyRegistry { public: // 注冊策略創(chuàng)建器 templatetypename T static void registerStrategy(const std::string name) { creators_[name] []() - std::unique_ptrIImageFilter { return std::make_uniqueT(); }; } // 創(chuàng)建策略實(shí)例 static std::unique_ptrIImageFilter create(const std::string name) { auto it creators_.find(name); if (it ! creators_.end()) { return it-second(); } return nullptr; } private: static std::unordered_mapstd::string, std::functionstd::unique_ptrIImageFilter() creators_; }; // 靜態(tài)成員定義 std::unordered_mapstd::string, std::functionstd::unique_ptrIImageFilter() StrategyRegistry::creators_; // 在main.cpp中注冊所有策略 #include strategy_registry.h #include gaussian_blur_strategy.h #include laplacian_strategy.h int main() { // 一次性注冊所有策略 StrategyRegistry::registerStrategyGaussianBlurStrategy(GaussianBlur); StrategyRegistry::registerStrategyLaplacianStrategy(Laplacian); // 運(yùn)行時熱切換 auto context std::make_uniqueImageProcessorContext(); context-setStrategy(StrategyRegistry::create(GaussianBlur)); // 處理完后切換到Laplacian context-setStrategy(StrategyRegistry::create(Laplacian)); }這個注冊中心讓策略徹底解耦新增策略只需在啟動時調(diào)用registerStrategyT()無需修改任何已有代碼。更進(jìn)一步你可以把策略名存在配置文件里程序啟動時自動加載——這就實(shí)現(xiàn)了真正的“配置即代碼”。5. 常見問題與排查技巧實(shí)錄那些文檔里絕不會寫的坑5.1 問題速查表從崩潰到卡頓的12個典型故障故障現(xiàn)象可能原因排查命令/技巧解決方案程序啟動即崩潰SIGSEGVIImageFilter析構(gòu)函數(shù)非虛派生類對象被基類指針刪除gdb ./app core→bt看棧幀檢查析構(gòu)調(diào)用點(diǎn)立即添加virtual ~IImageFilter() default;處理結(jié)果全黑/全白ImageData::stride計算錯誤導(dǎo)致內(nèi)存越界寫入valgrind --toolmemcheck ./app檢查非法內(nèi)存訪問用input.width * bytes_per_pixel校驗stride是否足夠多線程下結(jié)果隨機(jī)錯誤策略類使用static局部變量緩存中間結(jié)果gdb ./app -p pid→info threads→thread apply all bt改用thread_local或每個實(shí)例獨(dú)占緩沖區(qū)編譯報錯“undefined reference to vtable”抽象基類有純虛函數(shù)但未定義~IImageFilter()nm -C your_object.ogrep IImageFilter看符號策略切換后性能暴跌新策略未預(yù)分配內(nèi)存process()中頻繁new/mallocperf record -e syscalls:sys_enter_mmap ./app在構(gòu)造函數(shù)中預(yù)分配所有所需內(nèi)存日志顯示策略名為空name()返回局部字符串變量如return xxxgdb中p strategy_-name()看返回地址返回static const std::string或const char*validate()始終返回falseImageData::format枚舉值未正確初始化printf(format%d\n, input.format)打印原始值檢查枚舉賦值避免未初始化的PixelFormat::UNKNOWNARM平臺浮點(diǎn)計算結(jié)果不一致double在ARM上默認(rèn)用軟浮點(diǎn)x86用硬浮點(diǎn)readelf -A your_binary檢查Tag_ABI_VFP_args統(tǒng)一編譯選項-mfloat-abihard或改用float策略鏈?zhǔn)秸{(diào)用后圖像偏移后處理器修改了output的stride但未同步更新在每個process()后assert(output.stride input.stride)所有策略必須保證輸入輸出stride不變內(nèi)存占用隨處理次數(shù)線性增長temp_buffer_在process()中重復(fù)resize()而非復(fù)用pmap -x pid看RSS內(nèi)存增長趨勢預(yù)分配最大尺寸process()中只用clear()不resize()GDB調(diào)試時看不到策略類型編譯未開啟調(diào)試信息或優(yōu)化級別過高g -g -O0重新編譯生產(chǎn)環(huán)境用-g1保留基本符號調(diào)試用-g3跨DLL/so策略加載失敗Windows DLL導(dǎo)出符號未修飾Linux so未加__attribute__((visibility(default)))objdump -t your_lib.so | grep processWindows加__declspec(dllexport)Linux加可見性屬性5.2 實(shí)操心得五年踩坑總結(jié)的7條軍規(guī)軍規(guī)1永遠(yuǎn)用std::unique_ptr禁用裸指針管理策略我曾在一個醫(yī)療影像系統(tǒng)中用IImageFilter*存儲策略結(jié)果因異常拋出導(dǎo)致指針未釋放連續(xù)運(yùn)行72小時后內(nèi)存泄漏2GB。std::unique_ptr的RAII機(jī)制是C對抗內(nèi)存泄漏的終極武器——它不依賴程序員的自覺而是由編譯器強(qiáng)制保障。軍規(guī)2策略類禁止繼承只允許實(shí)現(xiàn)接口有同事試圖讓GaussianBlurStrategy繼承BaseImageFilter再讓BaseImageFilter繼承IImageFilter。結(jié)果BaseImageFilter里加了個virtual void init()所有派生類被迫重寫。記住策略模式的擴(kuò)展性來自“實(shí)現(xiàn)接口”不是“繼承基類”。接口越薄擴(kuò)展越自由。軍規(guī)3所有process()方法必須是const正確的bool process(const ImageData input, ImageData output) const——這個const不是裝飾。它向調(diào)用者承諾此方法絕不會修改策略自身狀態(tài)。這讓你能安全地把策略實(shí)例放進(jìn)std::vector甚至用const引用傳遞避免意外修改。軍規(guī)4用constexpr生成所有靜態(tài)數(shù)據(jù)拒絕運(yùn)行時計算高斯核、卷積權(quán)重、查找表……一切能在編譯期確定的必須用constexpr。我們曾把generateGaussianKernel()改為constexpr函數(shù)編譯后.text段減少1.2KB啟動時間快8ms——在嵌入式設(shè)備上這就是生死之差。軍規(guī)5為每個策略編寫“壓力測試樁”不要等集成測試才發(fā)現(xiàn)問題。為GaussianBlurStrategy寫一個stress_test_gaussian.cpp用std::chrono::steady_clock循環(huán)調(diào)用process()10萬次監(jiān)控內(nèi)存峰值和CPU占用。真正的穩(wěn)定性是在百萬次調(diào)用中不崩一次。軍規(guī)6策略的validate()必須覆蓋100%邊界條件我們的validate()檢查包括pixels!nullptr、width0 height0、stridewidth*bytes_per_pixel、format在有效范圍內(nèi)、input和output格式兼容。少一條上線后就可能收到客戶“上傳照片就閃退”的投訴。軍規(guī)7日志中必須包含策略的getParams()快照當(dāng)線上系統(tǒng)報警“Laplacian處理耗時突增”運(yùn)維人員第一眼看到的應(yīng)該是[Laplacian] strength5.0, kernel_size7, input_size3840x2160。沒有參數(shù)快照的日志等于沒有日志。5.3 性能調(diào)優(yōu)實(shí)戰(zhàn)從23ms到1.8ms的七次迭代在某跨平臺圖像處理Demo中GaussianBlurStrategy初始版本處理1080p圖像耗時23ms。我們通過七次精準(zhǔn)優(yōu)化壓到1.8ms第一次消除動態(tài)內(nèi)存分配原代碼在process()中std::vectordouble kernel(25)改為構(gòu)造函數(shù)預(yù)分配kernel_成員。效果-3.2ms第二次用float替代double高斯核計算用float精度足夠ARM NEON指令對float支持更好。效果-2.1ms第三次分離卷積將二維卷積拆為水平垂直兩次一維卷積復(fù)雜度從O(n?)降到O(n3)。效果-6.5ms第四次SIMD向量化用ARM NEON intrinsic重寫內(nèi)層循環(huán)一次處理4個像素。效果-4.3ms第五次緩存友好訪問調(diào)整內(nèi)存訪問順序讓CPU預(yù)取器能連續(xù)讀取。效果-2.7ms第六次分支預(yù)測優(yōu)化將if (x 0) x 0; else if (x width) x width-1;改為x std::clamp(x, 0, width-1)利用CPU分支預(yù)測器。效果-1.9ms第七次編譯器提示添加[[likely]]屬性標(biāo)記正常流程[[unlikely]]標(biāo)記錯誤處理。效果-0.5ms最終代碼片段// 優(yōu)化后的卷積內(nèi)核ARM64 void applyGaussianHorizontal(const ImageData input, ImageData output
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
精品色色| 色啦啦视频| 91精品婷婷国产综合 | 激情五月天噢美| 香蕉久久国产AV一区二区| 久久婷婷五月综合色丁香| 这里只有精彩视频| 涩九九九九| 97婷婷色| 色XX综合网| 成人电影AV在线观看| 国产这里只有精品| 97涩涩丁香五月天| 婷婷狠狠操| www久久久| 99精品视频在线6| 中文字幕操比影片| 99视频在线精品| 婷婷字幕在线| 丁香五月天激情视频| 六月丁香射婷婷欧美色图片| 色天堂A| 99这里只有| 伦99热| 婷婷色资源| 六月色婷婷| 六月99天天婷婷激情综合| 激情内射人妻1区2区3区| 婷婷 久综合| 91九色在线| 色五月婷婷五月丁香五月激情五月视频| 五月欧美丁香在线观看| 久99热在线观看| 激情五月天综合网| 五月丁香啪啪网| 狠狠干五月丁香| 99在线看视频| 91久热| 激情内射p| 美女天天艹人人爽| 99免费综合网| 婷婷色丁香五月| 色综合女人99| 婷婷丁香六月天激情四射网| 97狠狠色| 影音先锋一区| 99操视频| 99热欧美| 在线观看中文字幕| 五月天国产| 少妇性按摩无码中文A片| 情色婷婷五月天| 玖玖九九超碰| 五月丁香综合激情网| 成人电影丁香六月天| 色之综合网| 99狠狠| 天天视频精品9| 久久五月婷婷综合网| 久久这里只有精品热在99| 秋霞AV淫| 五月天另类小说| 人人草人人看| 色玖玖综合| 丁香婷婷婷五月| 色色色视频免费无码 | 久久丁香五月天| 久久久精品人妻| 婷婷综合六月| 色丁香婷婷美女视频网站| 五月婷婷六月丁香激情深爱| 综合激情五月四射婷婷| 99高级会所久久| 操逼五月天| av九九| 婷婷丁香五月亚洲免费| 天天操人人干| 97干免费视频| 99久热| 99在线精品视频| 丁香五月激情网| 五月天婷婷综合网| 色欲AVV| 丁香色婷婷| 婷婷五月婷婷| 综合五月婷婷| 亚洲亚洲人成综合网络| 色色色五月| 色综合婷婷99| 亚洲熟女色| 欧洲第一无人区观看| 久久五月天视频| 五月丁香精品| 亚洲乱码日产精品BD| 96自拍视频九色在线观看| 综合色在线| 97色精品视频| 亚洲综合视频网| 狠狠狠狠草草| 另类视频一区| 激情性五月天免费小说视频| 色五月丁香五月| 色99视频| 亚洲av网址| 十二区无码| 色丁香五月婷婷综合久久| 91精品久| 最新日韩久热免费视频看看| 婷婷五月天AV在线| 伊人六月无码视频| 亚洲综合视频在线| 国产99久9在线+|+传媒| 天搞天天天天天| 色婷婷91| 5月婷婷六月丁香| 久久黄色片| 日本在线噜噜| 色婷婷影院| 中文字幕丰满孑伦无码专区| 九九婷婷五月天| 人人爽欧美婷婷久久久五月丁香| 婷婷午夜激情| 99成人小视频| 亚洲乱码日产精品BD| 色婷婷精| 翔田千里aV中文字幕| 五月丁香六月婷婷久久久综合| 婷婷五月天六月综合| www,婷婷| 江苏少妇性BBB搡BBB爽爽爽| 9l视频自拍9l视频自拍九色学生| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 激情婷婷丁香| 高清无码.com| 97碰碰视频在线观看| 26UUU欧美激情一区二区| 丁香五月偷拍| 色天堂97| 色久五月天| 91丨九色丨东北熟女| 久久caop| 久久人妻久久| 色婷婷狠狠禁久久| 五月丁香婷色| 色色色色网站| 欧美五月婷婷综合| 精品免费99| 久久久8| 九九久久综合| 五月婷婷啪| 精品51XX| 影音先锋五月婷婷| 性色99| 夜夜爽天操| 五月激情六月综合| 大香蕉婷婷色| www98日本小时间到了| 丁香五月天在线直播观看| 狠狠色噜噜狠狠狠狠综合| 激情婷婷五月丁香啪啪啪| tingtingseav| 婷婷五月天在婷| 婷婷五月综合激情| 天天插天天插天天日| 丁香色婷婷| 久久久久久久久月丁| 风流少妇A片一区二区蜜桃| 久久五月激情| 91人人网| 日本色色色| 亚洲精品又粗又大又爽A片| 色一情一乱一乱一区91| 色婷婷丁香五月| 99碰视频| 五月天婷婷AV| 五月丁香啪啪啪啪| 欧洲色| 久大香蕉| 思思热99热| 激情综合五| 欧美 日韩 成人| 九九无码AV| 日日爽日日操| 色吊丝99| 五月天婷婷丁香| 九九热这里| 色色色干| 精品人妻伦九区久久AAA片| 五月天激情综合网| 久久多色| 玖操97| 99热亚洲| 少妇婷婷五月天| 最近中文字幕在线中文视频| 日日日影院| 深爱五月婷婷| 涩涩婷婷五月| 九九精品re免费视频| 尔尔AV一区| 98永久精品| 久久99精品久久久久久噜噜| 亚洲五月天婷婷| 高清无码视频网址| 99色这里| 热99.com婷婷| 婷婷五月电影院| 五月天久久久| 丁香五月婷婷色综合| 熟女婷婷网站一婷婷五月一丁香婷婷一婷婷激情网| 一点色成人网| 五月婷婷激情色情网| 国产在线网| 26uuu亚洲欧美| 日本英国美国欧美亚洲国产精亚洲日韩精品在线观看 | 中文字幕人成乱码在线观看| 婷婷激情综合网| 综合网精品99| 九九色色| 一起草无码| 99热香港| 久久人人九九| 热久久这里只有三级视频| 日韩三级片一区二区| 久久在线视频免费观看| www.婷婷,com| 亚洲人妻AV| 天天做天天要天天爱| 97色色视频| 丁香五月av在线| 五月天色色婷婷| 超碰在线看| 激情五月丁香色婷婷| 欧美性猛交XXXX乱大交极品| 99riAV国产精品视频| 婷婷成人网五月天| 小泽玛利亚视频一区二区| 俺去也综合| 五月婷人妻| 久久久噜噜噜操操操| 人妻操逼视频| 婷婷八月丁香激情综合| 激情五月www| 五月丁香色色网| 丁香五月欧美婷婷综合| 天天舔天天爽| 色优久久| www.五月天色色.com| 日本综合久久| 亚洲AVDVD| 亚洲无码影音| 国产成人片| 天天射影院| 我爱宗和色| 欧美综合五月丁香六月婷| 99ree6| 色婷婷国产精品综合在线观看| 九九99免费理论| 五月色婷婷夜色| 色九区| 久碰婷婷视频| 久久总和99| 99热精品无码| 99热在线播放| 五月天四色房丁香亭亭| 婷婷十月激情综合网| 79亚洲精品少妇| 在线观看av网站| 人妻激情网| 狠狠插.com| 色综合五月天| 色九九九九| 五月婷婷丁香在线视频| 99色免费视频| 婷婷五月色花丁香社区| 中文字幕丰满乱孑伦无码专区| 五月桃花网综合| 激情视频网址| 国产毛片精品一区二区色欲黄A片| 色五月天网| 婷婷精品视频| 99免费成人网| 五月婷婷免费视频| 人人操Av| 91啪级电影| 久久丁香五月婷婷| 极品 少妇 内射| 在线视频激情网站| 插逼综合网| 99久久久久| 美日韩成人| 色色操| 99热久草| 亚洲精品V天堂中文字幕| 丁香五月欧美| 国产五月视频| 久久艹网| 伊人狠狠丁香婷婷综合尤物| 91久久久久久久| 电影蜘蛛女| 六月丁香成人| 婷婷精品性性性性性性性| 婷婷五月天免费视频在线观看| 九色婷婷| 五月综合激情图片| 99热无码| 天天干天天干天天干天天干天| 五月激情丁香久久综合网| 亚洲 欧洲 国产 伦综合| 亚洲视频在线网| 91怕怕网| 亚洲操逼片| 六月五月丁香五月欧美| 夜夜骑天天操| 五月天激情小说网| 91色欲综合| 五月丁香成年黄色| 五月丁香综合网色欲| 九色91视频| 99热这里只有精品国产免费| 精品九九在线观看| 五月天激情开心网| 久久五月激情| 久久精品凹凸分类| 91se在线视频| 国产日韩欧美性爱| 欧美性生交xXxX久久久| 欧美在线97| 亚洲va欧美| 性色99| 欧美性爱一区| 99九九这里有免费视频| 婷婷五月情| 涩涩五| 色屌丝中文字幕| 在线日韩视频| 91碰九色| 五月婷婷狠狠干| 久久综合影院| 九九色婷| 五月青青草综合| 色香欲综合| 9色在线| 欧美色必爱| 狠狠干综合网| 婷婷五月天在婷| 婷婷97碰碰| 风流少妇A片一区二区蜜桃 | 丁香五月开心亚洲| 久久亭亭电影| 另类丁香五月天区图| 天天插天天爽| 人妻视频一区而且二区| 99色看这里只有精品| 丁香五月婷婷偷拍| 激情五月瑟瑟| 色噜噜婷婷| 九九激情网| 1024人妻无码中文字幕| 亚洲九九免费| 成人综合网站| 日韩a热| 五月婷婷激情久久| www.久久爱.c n| 亚洲AAAA网| 激情五月天社区| 嫩草AV久久伊人妇女超级A| 亚洲综合另类| site:xmssd.com| 精品人妻久久久久久| 极品人妻VIDEOSSS人妻| 六月婷婷之青青草| 99精品在线观看| 91九色中文字幕女在线观看| 激情5月婷婷| 成人精品一区日本无码网 | 婷婷五月天伦理| 午夜成人综合| 4399人妻无码久久久| 成人电影丁香六月天| 色婷久久| 米奇影视资源婷婷狠狠色激情欧美五月丁香| 五月婷婷精品无在线| 久热无码| 狠狠操天天操天天操| 色五月激情综合网| 五月婷婷色| 激情五月综合婷婷| 日本美女天天日天天爽| 97久久人人人干| 嫩草综合网| 五月丁香六月婷| 99九精品| 可以免费观看的av| 色婷婷色五月丁香| 免费一区二区三区| 色五月婷婷九月| 97视频久久| 91丨九色丨熟女|老版| 色五月婷婷老师| 色开心五月丁香| 五月六月婷| 亚洲啪啪精品| 99九九99九九九视频精彩| 另类图片色五月| 亚洲AV免费在线| 色欲Av五月天| 伊人喵咪a V| 开心五月激情婷婷| 黄网在线免费观看| 国产肥白大熟妇BBBB视频| 婷婷日日天天| 97碰碰碰| 1024人妻| 在线A色| 91在线精品一区二区| 五月天开心激情综合网| 五月天大香蕉| 激情人妻蜜夜系列区| 婷婷激情丁香六月| 亚洲Va成人| 亚洲成av人影院| 婷婷五月天激情文学小说| 在线观看国产高清视频免费网站| 五月伊人综合| 婷婷色五月激情| 婷婷丁香五月天狠狠| 亚洲亚洲人成综合网络| 99网| 激情综合色五月六月婷婷| 伊人在线另类| 久久小说网| 色五月婷婷一二| 五月丁香六月婷婷啪啪| 欧美亚洲色色色色| 成人片在线播放| 66精品成人免费网站在线观看 | 极品少妇高潮啪啪AV无码| aaaaa不卡| 九九精品大香蕉| 超碰人人操人人干| 六月婷婷开心| 深爱激情AV| 日本久久婷| 久操香蕉| 偷偷操99| 丁香婷婷五月六月天| 91九色视频在线观看| 1024操逼| 99综合免费视频| 色五月人妻| 国产丁香五月天婷婷| 国产午夜精品一区二区| 区欧美日韩成人| 激情综合五月| 色的色综合| 五月丁香激情婷婷综合| 日韩天堂久久| 操操操B| 538在线精品| 99爱免费视频| 国产五月婷| 五月婷婷色影院| 久久久精品婷婷五月天| www,黄色在线,con| 婷婷综合视频| 97色色色| 综合图区激情| 操人无码| 免费成人va| 香蕉狠狠爱视频| 五月天婷婷色色首页| 五月婷在线| 老司机伊人| 激情五月色婷婷| 五月色丁香激情| 六月婷婷俺也去| 亚洲超碰在线| 亚洲成av人影院| 精品五月天| 成人网在线视频| 五月天伊人综合| 武汉美女啪啪视频免费一级片| 亚洲无AV在线中文字幕| 欧美顶级少妇做爰HD| 国产色色色色| 无码中文一区二区三区| 狠狠人人| 五月色丁香婷婷中文字幕| 激情五月天综合图片小说网站| 无码人妻一区二区一牛影视| 91在线精品一区二区| 欧洲电影在线观看免费版英语版| 婷婷色影院| 成人网站在线观看视频| 国内外色色色色色成人视频| 亚洲男女激情| 爱99干99| www. 五月. com| 亚洲精品在线视频| 久久综合性| 亚洲丁香花色| 婷婷五月丁香五月天| 丁香五月网| 免费不卡狠操美女视频网 | 99久久国产宗和精品1上映| 五月欧美丁香在线观看| 超碰精品在线| 九九色婷| 婷婷狠狠18禁久久| 开心婷婷五月天综合| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 久久多色| 色婷婷先锋| 大香蕉五月天| 久婷婷视平| 99re在线免费视频| 激情五月婷婷丁香六月| 日韩一66精品| 久久九九在线视频| 五月丁香操婷逼| 色欲久久综合| 永久天堂日本| 99精品国产在热久久婷婷| 爱射综合| 婷婷丁香综合成人| 激情综合在线观看| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 91久久电影| 久久九九热视频| 中字幕视频在线永久在线观看免费| 1024人妻| 狠狠色狠狠爱| 色综合播放| 久久婷婷综合五月天| 99久久婷婷| 996黄色片| 久婷婷| 激情婷婷六月| 狠狠综合| 91精品综合久久婷婷九色| 欧美激情伊人| 亚洲综合视频一下| 97操操操| 欧美在线ee日韩| 九九AV在线| 激情 婷婷 插| 伊人在线视频| 婷婷九月亚洲| 丁香五月婷婷六月丁香| 草草色情综合网| 色综合久久44| 这里只有精品视频在线| 丁香九色不卡aaa| 久婷婷五月激情| 五月丁香六月色婷婷| www.久久99| 久久激情视频| 99re免费精品视频| 激情五月天色色色| 小视频一区| 五月天色色网站| 婷婷国产欧美97| 久热中文字幕在线线观看| 69精品人人人人| 大香蕉久久久久久久久| 五月色婷| 九九婷婷综合| 天堂综合久久| 亚洲六月婷婷| 大香蕉娱乐| 停停五月丁香| 人妻免费网站| 婷婷五月综合视频| 伊人久久丁香五月91| 成人欧美一区二区三区在线观看| 五月天婷婷丁香视频| 九九视频这里只有精品| 丁香婷婷综合激情五月色| 婷婷五月天色播| aaa久久久| 99热日本| 97爱艹婷婷开心丁香激情综合| 五月Huangsewang| 97深爱伊人综合| 五月丁香婷婷综合网| 91热久久| 99爱在线免费视频| 插插插色综合网| 亚洲操操| 婷婷五月精品在线| 色综合综合综合| 九九热视频精品| 五月婷婷之综合激情在线| 亚洲十月婷婷综合| 91在线资源| 成人免费高清在线播放| 99操视频| 中文字幕激情综合| 九色视频91疯狂| av大香蕉| 人妻精品久久久久久久| 五月天婷婷激情在线色图| 六月婷五月丁香| 久久探花91swag| 人妻中文av| 五月丁香婷婷免费视频| 日韩久久色| 五月丁香色婷婷| 婷婷六月插屄激情| 亚洲成人免费在线| 99久久综合精品五月天| 91精品久久久久久久久| 人妻久久久久久| 免費亭亭成人| 欧美偷偷操| 99热这里| 最新五月天婷婷影| 操久久精| 激情丁香五月婷婷| 成年人最刺激的综合网| 天天插天天狠| 色五月五月婷婷| 日韩激情人伦人| 国产九九一区二区三区| 天天操综合网| 久热这里只有精品99re| 综合大香蕉| 九九色网专区| 色停停香蕉视频| 丁香五月天人体| 五月丁香六月婷| 丁香五月综合在线观看| www九月婷婷| 任你艹| 婷婷在线午夜| 婷婷99狠狠| 91人人人人人人人| 久色激情| 欧美丁香五月97色| 操逼棍操逼| 久久综合图片| 99热超碰在线| 九九久久99| 国产资源91在线| 第四色色六月色综合| 大香蕉啪啪啪| 99久久久久久www| 婷婷综合成人五月天| 六月婷婷久久| 欧在线一区| 色婷婷成人做爰A片免费看网站| 婷婷综合网在线| 久久婷婷超碰| 无码人妻少妇色欲AV一区二区| 五月天婷婷在线播放免费| 婷婷色婷婷亚洲成人| 天久久久久| 丰满人妻妇伦又伦精品国产 | 另类视在线| 色情激情五月| 日本久久性| 五月天婷婷视频30| 热久久思思热思思| 99干在线视频| 热婷婷av| 婷婷综合中文| 成人综合网站| 99碰碰| 久久婷婷色| 91人人操.COM| 性热视频99精品| 欧美性色视频| 五月激情六月综合| 九九爱激情| 免费久久这里只有精品99| 天天干,噜噜色,狠狠色| 亚洲第一色网站| 99色婷婷视频| 激情四射五月天偷偷看婷婷| 91日综合欧美| 久久爱综合| 91a片爽| 爆乳熟女-区二区三区| 婷婷操无码| 天天日天天久久青青| 操一操干一干| 久草热在线视频| 丁香五月婷老师| 思思热AV| 99视频35精品视频在线观看| 久久婷婷色综合| 婷婷综合亚洲| 色六月婷婷| 九九九热精品| 欧美性丁香色色五月天干干| 97人人干人人操| 无码 av电影| 大香蕉五月丁香| 婷婷夜夜操| 婷婷涩涩五月天| 激情丁香九九五月综合网| 五月天丁香久久| 久久久久久综合88| 国产欧美日韩综合精品一区二区| 久久久精品色| 五月激情影院| Aaa久久| enecarbon-materials.com污K127封锁请涟系@wip1688 | 成人色色综合| 五月综合六月丁| 天天操婷婷| 五月停停丁香| 丁香婷婷射| 色狠狠六月| 久热这里只有精品6官网亚洲| 九九婷婷综合| 丁香婷婷免费| 99色在线观看视频| 婷婷五月天美女| 超碰操网| 欧美性丁香色色五月天| 国产九九一区二区三区| 99色精品| 成人国产网| 五月停亭六月,六月停亭的英语| 婷婷久久精品| 色婷婷在线视频久| 五月丁香婷中文字幕 | 91丨九色丨高潮丰满日本| 婷婷五月天激情网| 激情九九六月激情免费视频| 久久精品爱爱| 日本熟女二区| 国产乱子轮XXX农村| 欧美日韩欧美| 婷婷成人AV| 开心五月天私房婷婷| 久久五月天婷婷| 99∨VTV| 欧美色偷偷大香| 天天日天天摸天天| 婷婷九月综合| 中文不卡av| www.五月天婷婷.com| 综合五月丁香六月婷婷| 激情五月天婷婷| 亚洲超级碰| 丁香婷婷六月天| 99碰碰视频| 国产99久| 天天射综合网天天插| 欧美色久| 久久五月天丁香花| 激情5月天天天| 精品久久99码| 人人爽欧美婷婷久久久五月丁香| 五月婷婷五月天| 婷婷精品综合| 麻豆WWWCOM内射软件| 99视频内射三四| 激情涩涩网| 日日操,夜夜爽| 九九色精品| 超碰久热| 亚洲天堂色色| 五月停视频天堂| 五月婷婷在线网站| 99热这里只有精品99| 激情图片亚洲| 天天插天天狠| 色人久久| 五月丁香久久久久| 成人五月天丁香婷| 日韩淑女人妻luan伦激情精品一区二 | 人妻丰满精品一区二区A片| 婷婷操婷婷干婷婷射| 麻豆AV一区二区三区| 婷婷五月天色色| 色婷婷成人| 色噜噜狠狠色综合网| 日本在线va| 亚洲爆乳无码精品AAA片蜜桃| 久久大香免费| 婷婷丁香五月激情| 久色大香蕉| 丁香五月Av| Av免费网站在线| 五月亭亭综合五码| 国产色色色色色| 激情网婷婷婷| 91日本在线免费| 丁香六月婷婷综合缴| 97碰 在线视频观看| 永久AⅤ1| 五月激情婷婷国产精品久久久久久| 亚洲婷婷五月天综合| 婷婷五月激情丁香| 婷婷五月天在线综合导航| 天天爽天天爽| 丁香五月天黄色片| 97干在线视频| 丁香开心深爱| 九九九激情网| 久久999久久999久久999久久| 变态 另类 在线| 日日激情网| 日本在线视频看se99| 丁香五月婷婷网| 99ri精品在线| 色99色| 伊人综合网4| 激情五月天天| 中文字幕AV网址| 久久受www免费人成| 久久婷婷五月综合色和| 色欲五月婷婷| 久久人妻久久| 色五月婷婷视频| 99热99| 五月婷在线观看| 九月丁香婷婷综合激情| 六月婷婷毛片| 五月丁香综合网| 久9久9热久热| 亚洲综合色成丁香五月色| 综合久久六月| 婷婷久久婷婷色五月| www.zbzhongsen.com| 亚洲色婷婷婷婷人人爽| 1囯产午夜仑鲁鲁| 91成人视频| 色A网| 亚洲国产另类av| 色婷婷88| 亭亭色网| 亚洲mm免费| 日本99在线视频| 97色色色视屏| 免费观看全黄做爰的视频| 精品A√| 久久婷色| 人妻久久久久久久久久| 欧美99视频| 天天色情站| 欧美日比视频| 色五月婷婷五月久久| 99免费青青蜜臀| 成人无码精品1区2区3区免费看| 五月丁香久久久日婷婷久久婷婷日| 大香蕉人妻| 综合图片色色| 五月婷婷这里都是精品| www狠狠com| 青青草青青草五月天| 成人婷99最新| 伊人五月天男人的天堂在线| 丁香五婷| 亚洲亚洲人成综合网络| 六月丁香啪啪| 99热在这里只有精品| 99开心五月五月丁香激情| 久久婷婷东京热大香樵| 中文无码精品一区二区三区| 日韩黄色网络| 1024你懂的欧美曰韩| 色五月婷婷久久| 玖玖婷婷色五月| 婷婷五月天激情基地| 五月色亭丁香| WWW.桔色成人.COM| 五月婷婷av| 天堂综合久久 | 五月天四色房丁香亭亭| 五月婷婷丁香五月亚洲色| 久9视频免费播放| 二区成人视频| 亚洲亚洲人成综合网络| 丁香五月激情啪啪| 99激情在线| 婷婷五月天电影网| 免费日韩99| 亚洲精品乱码久久久久久按摩观| 色综合天天| 玖玖综合网| 丁香六月综合激情| 另类五月激情| 久久视频这里有精品99| 色 五月婷婷基地| 日日日日做夜夜夜夜无码| 久久99免费视屏| 五月天激情影院| 丁香激情久久| 午夜激情综合| 婷婷五月综激情| 色综合久久44| 182TV亚洲| 五月天丁香啪啪网| 色五月综合网站| 伊人久久丁香五月91| 97人人干视频| 丁香婷婷色情社区成人小说| 最新午夜理论片| 思思久久精品视频| 狠狠操天天操| 99热99免费| 五月激情综合五月| 另类丁香五月天区图| 久久久久人无码人妻| 丁香成人综合| 色五月激情综合| 色操b| 狠狠色丁香久久婷婷综合五月| 99久久精彩视频。| 午夜丁香六月婷| 婷婷五月,偷窥偷拍网| 伊人网碰碰| 五月玖玖| 91色吧网| aaa丁香五月天| 思思99精品视频| 色综合色色色色色| 久草热视频在线观看| 色噜综| 婷婷九月在线| 91色久| 99热碰碰热| 色五月六月| 色色亚洲| 综合久久综合综合| 狼人婷婷久久| 丁香成人综合| www.五月天社区| 五月天激情图片| 狠狠色综合网| 人与禽A片啪啪| 久久综合网桃花| 日本三级日本三级三级人妇四虎| 任你干嘛免费视频播放| 婷婷月五天在线在线看| 26uuuavcom| 人妻狠狠操| 久久五月丁香激情综合| 夜夜爱网站| 9色在线| 九色在线五月婷婷网址| 九月影院義母在线播放| 99这里只有免费的精品| 逼里香不卡| 九九RE视频在线精品| 极品少妇XXXX精品少妇偷拍| 92久操视频| 91丨九色丨熟女高潮| 五月丁香六月激情啪| 99热主页日本| 激情五月天视频| 天天久久九九| 色欲丁香| 五月色影院| 五月婷婷六月情| 国产午夜精品一区二区三区嫩草| 久久综合五月天| 亚洲av成人一区二区电影在线| 婷婷中文网站| 久久亚洲婷婷综合色五月| 丁五月激情视频免费| 激情六月婷婷| 丁香久久激情俄| 天天日人人| 日本99色| 中文字幕91,综合| 亚洲精品网站色视频| 五月天婷婷爱丁香中文字幕| 久久9精品| 激情五月天婷婷播播久久综合91| 五月色亭丁香| 国产片天天爽夜夜爽| 婷婷婷婷婷婷婷婷| 欧美三级巜人妻互换| 91中文狠狠综合| 金桔一区二区ab地址| 五月丁香啪啪网| 色欲AVV| 亚洲性受XXXX五月丁香| 五月天综合色| 大大香蕉综合在线| 久久在这里有精品| 99爱在线精品视频免费观看| 色停停影院五月天| 性99网站| 激情综合色| 婷婷五月欧美| 秋霞三及片| 99热成人| 精品久色| 岛国av电影网站| 精品人妻伦九区久久AAA片| 六月婷婷色色网| 日韩三级片一区二区| 色婷婷欧美| 激情五月天婷婷色色色色色色色色色色色| 六月丁香啪啪| 日本一级一片免费视频| 99久久精品国产色欲| 五月丁香六月婷婷视频| 五月综合六月丁| 五月丁香六月婷| 色综合色综合网| 色五月综合激情| 99爱爱网| 婷婷五月天亚洲天堂| www.99热| 91黄址| 在线观看欧美| 二级黄色毛片| 日韩久久色| 中文精品在| 色综合色五月| 久99久在线观看| 亚洲精品大片| 色综合久久88色综合天天| 天天日天天做天天操| 天堂在线伊久| 性色99| 丁香六月欧美| 五月丁香六月婷婷操操操| 国产综合久久久777777| 婷婷无码五月天| 99噜噜| 超碰在线视屏| 91婷婷搞| 色婷婷影视| 丁香5月激情网| 国产精品99久久久久久久女警| 伊人玖玖综合| 91色久| 99热这里在线精品| 亚洲成av人影院| 中文精品在| 久久99精品视频| 亚洲色欲欧美一区二区三区| 以及AA大片看看| 亚洲色激情| 最新日韩久热免费视频看看| 激情综合无码| 视频这里只有精品| 丁香婷婷成年| 丁香五月激情宗合网| 亚洲国产精品VA在线看黑人| 欧美综合在线五月天色婷婷| 色婷婷成人久久| 五月婷婷草| www.91.com处女在线直播| 成人国产欧美大片一区| 激情欧美五月丁香| 久久99精品日本| 亚洲婷婷免费| www五月天激情com| 伊人玖玖网| 丁香六月婷婷久久综合| 色播丁香婷婷五月激情| 五月久久婷婷天堂视频| 精品久久人妻| 五月丁香亚洲校园欧美| 俺去也五月| 丁香五月天在线直播观看| 久久44| 91精品婷婷国产综合久久| 五月婷婷六月丁香首页| 五月丁香影院| 激情欧美婷婷| 99精品成人无码A片观看金桔| 婷婷欧美偷拍综合| 色婷婷色综合久久精品V| 久久久8| 色婷婷五月天激情综合| 97在线刺激| 国精产品一区一区三区免费视频 | 97色婷婷| 99热这里只要精品免费| 亚洲婷婷五月天在线激情综合网| 色婷婷影院| 婷婷五月丁香综合瑟瑟| 成人在线不卡| 国产午夜精品久久久观看| 中文字幕av久久爽一区| 99精品成人无码A片观看金桔| 亚洲激情淫网| 欧美性交一区二区三区| 4399无码视频| 欧美在线操| 热的国产,热的综合,热的有码| 99re热在线视频| 五月天婷婷青青草| 狠狠插.com| 久综合网| 97激情五月天| 9色免费网| 日韩成人AV在线| 五月婷婷之综合激情| 99热精品10| 色婷婷久久综合| 99re6在线视频精品免费| 噜噜干日本| 六月婷婷狠狠色在线观看| 黄色AV日韩| 色五月婷婷成人| 专区无日本视频高清8| 996热| 视频一二区| 色都都狠狠色都都色综合色| 538在线精品| 思思热高清在线观看| 婷婷色五月久久| 99色色爰| 99久久超级| 成人婷婷| 99热天堂| 久久精品性爱| 男人的天堂97| 亚洲亚洲人成综合网络| 欧美色色色| 丁香婷婷色五月| 九九色99| 天天肏天天肏天天肏| 五月天激情婷婷久久| 无码人妻一区二区三区四区| www.夜夜操.con| 伊人狼人干| 日本综合九九| AA片在线观看视频在线播放| 99热免费在线| 天天日天天摸| 女同激情久久av久久| 欧美丁香五月97色| 亚洲无码yw| 色热久| 日本在线va| 五月婷婷激情综合| 五月天婷婷激情在线色图| 色色亚洲五月天| 欧美六月| 天天爱天天做天天日| 久久丁香婷| Caoporn公开| 99久久欧美| 天天干天天操天天上| 色婷丁香五月| 伊人婷婷激情| 亚洲第精品| 女人天堂 AV| 99热这里只有精品最新地址获取| 色婷婷操逼| 婷婷午夜精品久久久| 玖玖在线视频福利| 五月天狠狠网站| 五月激情精品视频| 婷婷五月欧美综合| 色色婷婷综合网| 人人操人人爱丁香五月| 丁香桃色网| 五月色综合| 久久538| 婷婷五月大香蕉| 天天综合网在线| 五月天婷婷青青草| 98毛片| 五月婷在线观看| 婷婷另类开心| 久热视频这里只有精品| 婷婷深爱五月丁香| 久久婷婷五月综合色奶水99啪| 五月丁香六月婷综合成人综合| 五月色丁香婷婷中文字幕| 天天 青草 丝袜制服 在线| 丁香午夜天| 亚洲激情综| 中国女人做爰A片| 五月丁香五月综合欧美| 久久久久人妻网址| 丁香五月激情综合| 久久久久久久久久久久63| 99色精品| 天天爽天天日人人爱 | 99婷婷| 综合色五月天| 天天人人人人人人人人人人人| 婷婷丁香五月高清| 色婷婷狠狠18禁| 中文字幕网伦射乱中文| 99热在线播放| 色天使色综合| 99小视频在线| 天天影视色综合网| 久热大香蕉| 人人草人人爱| www.久99| 丁香五月激情婷婷视频| 青青草六月丁香| 亚洲AV网站| 伊人久久婷婷五月综合97色| 9久国产精品| 婷婷的99视频网站| 五月天成人在线播放丁香| 99热精品中文字幕| 国内精品免费一区二区2009| 丁香五月电影| www.26uuu.com亚洲电影| 欧美日韩一区二区三区四区| 六月成人网| 操操啪| 婷婷五月天激情小说| 婷婷操逼| 91肏| www,婷婷五月天,com| 天天综合精品| 五月婷A V在线| 天天爽夜夜爽夜夜爽精品| 亚洲婷婷五月草久| 97性视频| Av在线不卡一区| 99思思在线视频| 五月婷婷色综图片| http:色情日本com| 五月丁香六月香香蕉| 色天五月天在线观看视频| 丁香五月婷婷基地| 97人妻碰碰碰久| 99热无码首页| 夜色五月天| 精品综合久久久久久五月天| 九九这里是免费的视频5| 2022久久婷婷| 夜夜噜夜夜奇| www.久久| 丁香五月激情婷婷视频| 五月天婷婷色播| 婷婷五月综合激情| 91婷婷搞| 九九大香蕉黄色影院| 超碰色天堂| 丁香五月冃欧美| 色色欧美。| 再綫Av免费視品| 日本五月天激情| 亚洲视频久久| 天天干天天射综合网| 少妇搡BBBB搡BBB搡毛茸茸| 婷婷六月色| 丁香五月电影| 人人操日| 色欲久久久久久综合网综合网| 99re热视频这里只精品| 密臀av无码人妻精品| 99热免| 精品少妇人妻AV无码专区偷人| 丁香视频| 热99这就是精品视频| 久久久久久久久月丁| www色中色综合| 香蕉AV福利精品导航| 影音先锋男人资源站一区二区| 四虎婷婷五月天| 欧美 日韩 人妻 高清 中文| 色综合久久伊伊婷婷五月| 综合网亚洲| av大片在线|