日韩精品一区二区三区在线视频放-无码中文字幕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í)驗(yàn)室參與一個跨平臺圖像處理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è)計(jì)標(biāo)準(zhǔn)接口曲軸法蘭、油路接口、ECU通信協(xié)議讓V6、電動機(jī)、氫燃料模塊都能即插即用。策略模式就是給代碼里的“行為”裝上這套工業(yè)級接口標(biāo)準(zhǔn)。這個模式特別適合出現(xiàn)在四類場景中一是業(yè)務(wù)規(guī)則頻繁調(diào)整比如電商的滿減計(jì)算從“滿300減50”突然變成“滿300減50再送10元券”二是需要支持多種算法并存且用戶可選如文本編輯器的拼寫檢查引擎可切換基于詞典、基于NLP模型、基于用戶習(xí)慣的三種策略三是不同平臺/硬件需適配不同底層實(shí)現(xiàn)如剛才說的圖像處理GPU加速版、CPU純計(jì)算版、低功耗傳感器融合版四是測試驅(qū)動開發(fā)中需快速替換模擬實(shí)現(xiàn)比如用MockNetworkStrategy替代真實(shí)HTTP請求繞過網(wǎng)絡(luò)依賴做單元測試。關(guān)鍵詞“C設(shè)計(jì)模式”“策略模式”“strategy pattern”背后實(shí)際指向的是C這門語言特有的能力邊界與工程約束它沒有Java的interface關(guān)鍵字不支持Python的鴨子類型但擁有虛函數(shù)表、模板特化、RAII資源管理等獨(dú)特武器。所以C中的策略模式絕不是照搬UML圖就能跑通的紙面方案而是一場在編譯期與運(yùn)行期之間、在內(nèi)存布局與接口抽象之間、在性能敏感與擴(kuò)展靈活之間做的精密權(quán)衡。接下來我會從設(shè)計(jì)思路、核心細(xì)節(jié)、實(shí)操實(shí)現(xiàn)到排錯經(jīng)驗(yàn)一層層拆開這個看似簡單、實(shí)則暗藏玄機(jī)的模式。2. 內(nèi)容整體設(shè)計(jì)與思路拆解為什么不用函數(shù)指針為什么拒絕模板全展開2.1 傳統(tǒng)方案的三大死穴硬編碼、耦合爆炸、測試失能在沒引入策略模式前我們團(tuán)隊(duì)最常用的方案是“函數(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ù)——因?yàn)檫@會把OpenCV綁定死。正確做法是定義process(const ImageData input, ImageData output)其中ImageData是自定義的輕量結(jié)構(gòu)體只含寬高、像素指針、格式枚舉。具體策略Concrete Strategy每個類只專注一件事。GaussianBlurStrategy只管高斯卷積核生成與應(yīng)用LaplacianStrategy只負(fù)責(zé)二階導(dǎo)數(shù)計(jì)算它們之間零依賴。更重要的是每個策略類可以自由選擇自己的依賴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%。因?yàn)槊總€Strategy模板實(shí)例都會生成一份完整代碼ImageProcessorGaussianBlurStrategy和ImageProcessorLaplacianStrategy完全獨(dú)立連日志函數(shù)都各自復(fù)制一份。最終我們采用混合方案接口層用虛函數(shù)保證運(yùn)行時靈活性核心計(jì)算層用模板內(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è)計(jì)讓虛函數(shù)調(diào)用只發(fā)生在策略切換的“決策點(diǎn)”而高頻計(jì)算路徑完全規(guī)避了動態(tài)分派——這才是C工程師該有的精度控制。3. 核心細(xì)節(jié)解析與實(shí)操要點(diǎn)從頭手寫一個工業(yè)級策略框架3.1 接口設(shè)計(jì)的黃金三原則窄、穩(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... };注意堅(jiān)決不用std::vectoruint8_t或std::shared_ptr。前者帶來堆分配開銷后者增加引用計(jì)數(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)。第三驗(yàn)證必須可測Testable接口必須自帶驗(yàn)證鉤子。我們在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()生成測試報(bào)告標(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ù)計(jì)算卷積核 } 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); } // 核心計(jì)算使用預(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è)計(jì)決策資源自治構(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)第一個具體策略——高斯模糊我們選擇高斯模糊作為首個策略因?yàn)樗銐虻湫颓夷鼙┞蛾P(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ù)計(jì)算高斯核避免每次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í)際項(xiàng)目用分離卷積優(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í)際項(xiàng)目中發(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計(jì)算錯誤導(dǎo)致內(nèi)存越界寫入valgrind --toolmemcheck ./app檢查非法內(nèi)存訪問用input.width * bytes_per_pixel校驗(yàn)stride是否足夠多線程下結(jié)果隨機(jī)錯誤策略類使用static局部變量緩存中間結(jié)果gdb ./app -p pid→info threads→thread apply all bt改用thread_local或每個實(shí)例獨(dú)占緩沖區(qū)編譯報(bào)錯“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)計(jì)算結(jié)果不一致double在ARM上默認(rèn)用軟浮點(diǎn)x86用硬浮點(diǎn)readelf -A your_binary檢查Tag_ABI_VFP_args統(tǒng)一編譯選項(xià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)行時計(jì)算高斯核、卷積權(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)報(bào)警“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高斯核計(jì)算用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天堂视频| 亚洲成?V人片在线观看福利| 人人做,人人操,人人摸| 蜜区区视频79| 骚鸭AV| 亚州色交| 99欧美| 国产精品一级片在线看| 日韩性爱一级片| 人妻夜爽夜夜爽| 亚洲欧美一区二区不卡视频播放 | 五月天大香蕉| 成人三一级一片aaa| 四虎精品永久在线播放| 国产一区在线播放| 欧美色97| 久久久久幕乱码| 夜夜騷av、一區二區| 大香蕉免费中文| 自拍偷拍 日韩无码| 97精品97久久| 亚洲午夜福利视频| 欧亚成人| 天天摸夜夜添无码小视频| 97精品免费视频网站| AV男人天堂网| 中文一区二区| 男人的午夜天堂| 超碰97护士| 国产精品午夜AV完会免费| 九九九九精品视频| 清纯唯美综合| 91综合网站| 欧美性第一页| 91在线免费精品视频| 国产精品一级片在线看| 精品人妻伦一二三区久久| 91c色| 日韩卡一卡二卡三在线| 亚洲啪啪视频一区二区| 夜色AV无码手机在线影院| 丁香六月激情| 三级网色| 久久久婷| 久久国产精品,久久国产| 秋霞男人网| 伊人991| 青春草A| 热热热热日日漂亮永久永久国产日| 欧美色图亚洲色图成人在在线| 亚洲熟妇极品| 日韩操呦呦影院在线观看| 日韩精品人妻中文字有码在线| 日韩资源网| 91天天爱| 黑人综合网| 夜夜草我| 在线啊v一区| 激情五月天社区| 久久偷偷色综合蜜桃| 60秒免费小视频| 九九超碰综合网| 蜜臀久久99精品久久久久久| 日本操逼视频不卡直接放| 国产高清26uuu| 国产高清成人传媒影视| 99啪啪视频| 9999久久久久| 日韩精品在线视频,日韩精品……| 亚洲黄片免费在线播放| 夜嗨影院| 熟妇视频一区二区三区在线观看| 啊啊啊爽爽| 在线观看成人性爱免费小视频| 91动漫操逼视频| 1024日韩| 人妻美腿丝袜日韩| 青青青国产手线观看视频2| 人人摸人人叼| 嗯嗯嗯啊啊啊干死我吧| 97免费视频在线观看| 日韩不卡毛片Av免费高清| 久久综合18p| 精品国产乱码久久久影院| 人人操欧美风骚| 蜜乳AV一区二区三区四| 午夜欧美J进J出白浆流出久久久 | 天天干夜夜肏| 狠狠婷婷亚洲中文综合久久| 超碰在线国产| 97资源久久| 免费A V在线播放| 亚州精人品大香蕉| 99在线观看视频在线高清| 一区不卡在线观看av| 色妺妺在线视频| 亚洲 欧美 综合 91| 69一区二区三区 | 亚洲人妻一区二区三区| 天堂综合网| 精品一区二区综合熟妇| yazhouzaixian| 日韩免费在线观看不卡| 国产日本熟女顶级一区二区三区视频| 人人澡人人干| 艹我哪美一区无码| 91中出| 色婷婷五月综合| 欧美啪啪天堂| 免费一级视频特黄色大片| 99热在线播放| 蜜桃丰满熟妇av无码区不卡| 欧美亚洲高清晰| 中文字幕欧美丝袜07资源| 欧美熟女丝袜| 伊人久久亚洲中文字幕不卡| 国产一区在线观看无码AV| 九九九午夜| 久久东京热久久| 天天爱天天操| 91亚洲网| 日本少妇va7777| 一级性爱视频免费在线| 后入 亚洲 美女 射| 香蕉99秘 一区精品蜜桃臀| 亚洲精品三| 欧美视频一区二区三区| 五月婷婷色| 国产又粗又长的视频| 五月天婷精品激情| 色综合91好| 加勒比大香蕉视频在线| 超碰97护士| 亚洲情色1区| 免费少妇一区二区| 精品无码久久| 亚洲国产精品乱码在线观看| 精品日韩人妻视频| 一二三卡欧美日韩人妻免费精品| 日日干日日| 欧美精品一二三| 乱人伦 国语对白:视频直接看| 偷拍五区| 亚洲aw毛茸茸在线 | 亚洲天堂另类| 天堂伊人久久| 99精品在线播放| 欧美第二页| 性欧美体内射精| 黄片色区软件| 国产 日韩 欧美一区| www.一本大99| 99热亚洲| 免费看A片毛毛片在线播| 欧美后入式| www.色婷婷| 99久久精品欧美国产| 欧美日韩中文视频播放| 黑丝少妇在线观看| av绯色| 四虎在线视频| 婷婷九月丁香| 亚洲熟女乱熟乱熟妇综合网二区| 五月大香蕉| 91深夜夜| 八戒午夜福利理论片| 国产九九九九九九| 好爽免费视频,| 啊啊啊好湿久久| 九月丁香综合网| 大香蕉欧美| 亚洲欧美日韩电影网站一区 | 丁香五月性| 日本孕妇一区二区视频操逼免费看 | 日本高清视频在线观看黄已三辽| 91人人看| 国产原创自拍| 欧美白嫩在线放| 成年人一级黄色毛片大全在线观看| 亚洲熟女综合一区二区| 老熟女综合网| 亚洲综合色在线| 欧美操逼视频二区| av在线人气| 一级黄色影片| 久久精彩视频| 亚洲AV免费在线观看| 国产亲戚伦亲在线| 国产成年女黄特黄| 精品人妻av区天天看片| 97欧美久久久久久久| 欧美日韩国产人人| 96国产污污污丝袜| 精品久久九| 曰本熟女视频| 欧美久久婷| 男人天堂2019亚洲| 久久精品国产精品亚洲艾通辽熟妇| 99色热国产视频精品| 五月丁香黄色网| 人妻久久| 亚洲熟女综合网| 午夜经典| 日本女人久久久| 欧美色交| 国产99久久99热这里只有精品15 | 欧美少妇高潮视频| 大但人体久久久久| 天美91| 久久久一区二区三区麻豆| 亚洲熟妇AV日韩熟妇在线| 狠狠躁天天躁日日躁| 国精综合一二三区影视| 超碰 欧美| 99re6在线视频精品免费完整版安卓版| 老司机免费视频在线91| 亚洲风情在线观看| 边做饭边操逼逼| 91久久免费视频互動交流| 一区在线精品中文字幕| AAAA欧美日韩| 性色av婷婷久久一区二区点复制| 婷婷尹人大香蕉免费| 人人摸人人干| 自拍欧美| 公司1区2区3区精产精| 后入综合久久| 中文人妻av高清一区| 日韩av不卡在线看| 国产成人无码久久精品| 91美腿丝袜在线观看| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 一区二区三区四区免费视频| 婷婷精品| 激情人妻另类| 狼人狠干| 91精品人妻一品二品三品| 97中文字幕一区| AV天堂因数| 精品九区| 日韩av免费一级电影| 日韩乱伦AⅤ| 麻豆精品A片免费观看| 国产精品久久久久亚洲av| 酒色综合网| 国产无码精品久久久久久| 性夜影院爽黄A爽免费动漫| 92性色国产午夜福利在线661| 亚洲自拍天堂| 日韩三级一区 | 男女打扑克高清网站| 久久超碰亚洲人| 久久一区二区加油站| 少妇的嫩逼图片| 男女激烈网站最新| 91九色精品熟女内射| 神马久久久久久久久久久久| av2014 日韩在线中文字幕| 九九九九热| 狠狠色噜噜狠狠狠狠狠色综合久久 | 思思在线免费视频| 欧美天堂日韩三级国产传媒| 久热热| 日韩中文字幕人妻视频| m欧洲一级午老| 91性情| 色色香蕉| 日韩钢筋无码高清啾啾啾| 超碰碰97资源站| 日本三级一区二区 在线| 超碰亚洲欧美日韩无| 色网亚洲人| www亚洲免费| 性站 | 日韩精品一区二区三区四虎影视| 夜夜 中文视频rt| 午夜性刺激视频免费观看| 日韩精品视频在线观看一卡二卡| 狠狠躁日日躁夜夜躁A| 婷婷久久五月综合激情| 色鬼在线综合| 韩国三级一线观看久| 婷婷成人久久久精品| 日韩电影中文字幕| 久热九九| 亚洲天堂另类| 色丁香久久| 国产日韩中文字幕欧美| 日本精品无码三级网站| 91天天综合在线观看| 国产成人一级av88| 精品人妻伦一区二区三区久久| 麻豆国产视频精品观看| 国产又大又粗又长视频在线| 欧美精品日韩久久久九| 超碰伊人在线| 精品国产一级久久| 99re在线视频这里只有精品| 亚洲一区二区三区四区视频| 中文字幕丝袜| 水澄无码AV| 日本不卡二区| 国产和美国毛片| 天天拍天天操| 97免费视频在线观看| 五月天激情小说| 欧美色另类| 日韩人妻精品久久久久| 色色色日本| 丝袜无码a片| 在线无码视频| 99热在线只有精品| 九九久久久久久爱| 青娱乐欧美激情一区二区| 加勒比av中文| 91色久| 啊v在线观看视频| 日本三级久| 亚洲日韩视频二区| 日本亚欧爱爱| 欧美亚涩| 操一区| 探花一区在线| 好属操| juliaann精品熟女一区| 一区二区影院| 亚洲欧美另类图片| 亚洲诱惑| 熟妇人妻精品一区二区视频色欲| 无码久久亚洲高清,| 草久久久| AV电影在线播放| 天天日天天操天天射河南省| 国产免费一区| 91黑丝少妇| 精品亚洲黄色片 国产精品导航一区二区 | 青青草男人天堂| 一区二区三区精品视频| 日本一区二区不卡| 九九九不卡| 夜夜嗨绯色| 婷婷久久综合久| 久久久久亚洲AV无码专区少妇| 久久久久深夜无码| 欲色影视综合吧| 中文字幕日本久久| 手机看片日韩人妻| 国产精品ww久久| 加勒比综合a∨| 四虎永久在线精品免费网址| 婷婷亚洲天堂| 日本视频一区二区三区| 精品人妻免费观看| 91欧美网| 舔人妻中文免费视频| 大香蕉日韩| 欧美国产成人在线| 欧美久久婷婷| 午夜福利久久久噜久噜久久综合| 久久五月综合| 亚洲国产一区二区三区四区国产| 蜜乳av一区二区| 国产精品香蕉| 亚洲熟女av中文字幕| 欧美激情亚洲情色| 日日干夜夜干| 在线性黄高清免费视频| 国产在线强奸视频| 超碰免费人妻人人| 黑人娇小av在线播放| 久99在线免费观看视频| 中文字幕精品亚洲熟女| 天天色怡春院| 另类 综合 日韩 欧美 亚洲| 亭亭丁香激情| 青青青青草av在线观看| 久久久久元码视频| 亚洲视频二区 | 亚洲日本天堂| 久久久久久九九九九九九| 天天看高清麻豆| 久久欧洲| 中文字幕女同在线| 在线五区| 91亚.色| 96国产精品| 伊人九九| 国产精品99999| 国产精品久久久啊| 色呦呦国产精品免费看| 国产家庭乱伦表演| 久久精品久久九九精品| 日韩乱中文| 日韩精品亚洲专区在线影视| 亚洲欧洲国产综合av| 成片免费播放| 丝袜AV一二三区| 天堂av2019| 欧美性爱一区| 精品国产乱码久久久久久久久1| 六月丁香啪啪| 婷婷91| 大香蕉av在线| 97欧美精品综合| 欧美韩国你懂得在线| 久久成人午夜狠狠| 亚洲高清91| 白丝AV| 熟妇的味道HD中文字幕| 每日更新AV| 欧美激情五月天| 国产av白丝| 九九九影院| 欧美日韩人妻精品一区二区三区| 色臀AV| 操啊国产| 狠狠狠狠狠| 国产精品网站免费| 91免费看中出视频| 一个色导综合| 亚洲激情四射| 美女主播色欲91抠b在线播放| 91美女高潮| 人妻少妇精品| 在线看免费无码AV天堂的| 志村玲子视频一区二区| 动漫av中文| 麻豆成人AV| 26uuu偷拍亚洲欧洲综合| 国产高潮AA片免费看| 夜夜狼人妻| 夜夜欢天天干| 日韩,欧美,中文在线| 99re69| 九九九九九九综合| 一本色道久久天天射天天干| www.超碰| 超碰综合97在线| 2017av无码免费无线播| 天天情欲宗合网| 天天日夜干| 日韩av一级黄片| 91欧美成人色站| 91美女精品| 超碰人妻天天干| 伊人影院中文字幕| 综合亚洲欧美| 偷看洗澡一二三区美女| 搞中出视频在线观看| 日韩国产精品人妻无码久久久| 九久久精| 18禁中文字幕| 玖玖综合色| 懂色aV一区二区天美传媒| 9国产超碰| 欧美嫩性色| 日韩欧美麻豆| 人人扣人人操| 自拍第一页| 国产av强奸美女| 欧美精品丝袜久久久中文字幕| 欧美色图20P| 欧美性生活综合| 97网址97| 99.色网| 日本男人插女人的逼黄色| 国产对白刺激视频| 无码99| 日韩有码专区| 日韩欧美性吧婷婷乱伦大香蕉| 天天干天天日天天射黄色大片 | 亚洲精品国产精品乱码不99| 美女91色黄18| 精品超碰国产| 美女性91| 蜜桃成人1区2区3区| 春色综合网| 国产后入精品| 亚洲国产精品无码AV久久| 中文字幕一区 二区三四五 区日 日骚| 超碰99在线| 亚洲有薄码区日本系列中文字幕| 丰满人妻被猛烈进入中| 色婷婷综合久久久久中文一区二区| 亚洲se91| 无码人妻一区二区一牛影视| 九一综合精品视品av| 亚洲天堂精品日韩电影| 国产白领连续中出在线播放| 亚洲中文国际强奸字幕| 9久9久9久9久视频网站| 成人影 天天操 亚洲| 欧美福利视频啊啊啊啊| 精品无码人妻一区二区免费蜜桃| 操逼片中文| 精品人妻久久久久一区二区三区| 九九毛片这里只有精品| 天天操夜夜嗨| 亚洲风情在线观看| 狠综合网| 99久热| 日韩欧美午夜一区二区| 伊人网在线点播| 综合网,亚洲,欧美| 免费精品中文字幕| 日韩色| 国产天天看| 久久精品六区| 91久久精品国产| 黄色电影在线播放综合网站| 国产一级操B视频| 一区二区三| 偷拍超碰| 久色网| 日韩熟女操逼| 久久伊人东京热| 日本中文字幕高跟| 99热精品在线观看| 国产一区在线观看无码AV| 东京热,男人的天堂| 久久久久久久久久久久黄色| 天天日少妇逼AV| 欧美日韩精品一区二区三区高清| 天天看片青娱乐| 999熟女精品| 激情图片亚洲色图| 国产欧美伊人| 亚洲色啪| 日本www操操操| 亚洲码在线中文在线观看| 99999久久精| 久久久久久久久久久久欧美日| 天天综合网国产| 国产成人无码网站在线视频| 天天草夜夜草高潮片| 亚洲天堂精品日韩电影| 久久久久99精品成人片蜜臀| 熟女91网| 99热国产| 亚洲日本大香蕉1| 精品久久九| 黄色不卡视频| wwe 天天干.com| 天天日日舔舔| 亚洲图片欧美日韩| 婷婷九月| 狠狠色色| h在线看免费版在线看| 欧美成人一区二区三区在线播放| 国产欧美一区激情交| 天美传媒av一区二区| 久久九九一区二区三区成人| 肥佬影院91| 亚洲se电影| 日韩色图 一区二区| 欧美亚洲se91| 啊啊啊啊啊好舒服视频| 一区二区三区在线日韩影院观看| 欧洲精品久久| 国产精品3| 蜜臀th| 男人天堂无码| 日本黄色天堂| 成人在线永久| 亚洲色图伊人网| 亚州欧美一区| 青青青草原| 亚洲激情久久久伊人综合| 超碰4A| 中文乱码字幕观看视频| 伊人影院日本| 午夜视频好爽啊| 亚乱色| 综合啪啪| 一二三啪啪专区| 欧美A√综合网| 色偷偷人人玩人人舔人人操人人摸人人爽 | 亚欧成人综合影院| 人妻少妇av在线观看| 激情久久久| 91在线美女| 国产九区| 色诱中文字幕| 成人av性爱电影在线观看| 久久精品综合| 色逼综合| 久久国产乱子伦精品免费女人| 蜜乳AV一区| 日本 欧美 国产一区| 98色网| 热久久九九热| 久久精品国产97欧美精品亚洲| 91九色丨风韵犹存| 一本大道不卡一二三区| 操美女高潮抽搐白浆| 暖暖精品二区三区观看| 91色s| 亚洲国产精品无码AV久久| 精品国产91av一区二区三区| 欧美99热| 美女诱惑在线一区| 日韩十八禁| 国产隔壁老王影院在线| 久久五月丁香| 性爱欧美五月| 综合夜夜| 女人被添高潮免费视频| 麻豆国产第一| 99人妻| 亚洲欧美日韩夜夜| 国产青视频| 青青青青青手机视频| 亚洲免费成人在线高清无码视频| 天天操夜夜操| 久久久91福利姬| 欧美18 在线观看| 天天干天天干天天干| SUV一区二区在线看| 9久久精品| 操逼操操操91| 中国熟女91| 自拍偷拍国产欧美日韩韩| 日日干夜夜干| 最新日产中文在线麻豆| 欧美日韩国产中文精品字幕自在自线, | 亚洲伊人久久精品狠狠在线| 草草草草视频| 五月天色色色| 91精品国产长腿丝袜美女| 又大又长又粗又爽又黄| 国产福利夜| 丰满人妻被猛烈进入中| 91男女啊啊啊| 少妇久久久久久久久| 青青草黑寡妇男人天堂| 久久精品一区二区三区蜜桃臀| 91人妻视频| 国产精品久久久蜜臀| 久久人人爽爽爽人久久久| 五月丁香激情综合网| 亚洲码在线中文在线观看| 性暴力欧美猛交在线直播| 久久久亚洲精品电影免费看| 亚洲资源站| 色色热| 久久久久久九九九九九| 超碰狠狠操| 91熟女丨91老女人| 日本91白丝| 激情五月天中文字幕色| www四虎| 偷拍 欧美 日韩| 一区二区三区日韩欧美| 激情小说日韩无码| 久久久网一区| 国产亚洲日韩在线三区黑人| 亚洲一二三四区在线免费看视频| 秋霞影音一区二区三区| 青青草一区二区三区四| 高清无码国产亚洲| 美女91| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 中文字幕亚洲欧美在线不卡| 成人一道本免费视频| 蜜臀99999| 91老熟女老女人国产老太| 免费?级毛片无码?∨蜜芽试看| 五十路熟女工口 | 亚洲 se图 欧美电影| 国产多人在线观看视频| 96国产污污污丝袜| www.色操逼| 中文字幕三四区| 欧美大香蕉97| 国产成人自拍视频在线| 极品色综合| 玖玖蜜臀资源网| 亚洲暴力强奸AV| 日韩15p| 影音先锋一区二区在线资源| 日本精品第一视频在'| 91制服丝袜中文字幕| 自拍丝袜美腿人妻| 无码精品蜜桃一区二区三区ww| 99re视频在线播放青草| 亚洲黄日韩无码专区| 天天躁日日躁XXXXYY| 男人天堂2017| 亚洲91综合| 日本免费不卡二区| 少妇3P性爱自拍| 欧美日日人人天天| 国产又色又爽又舒服的三级视频| 一级黄色性爱裸体视频| 超碰色美女| 北京美女一区二区| 91c色| 久久产精品一区二区三区电影| 91在线/欧洲| 啊啊啊啊啊啊啊国| 国产视频不卡在线观看| 性爱网站一区二区| 9Ⅰ超碰| www.acm成人黄色毛片| ss久久| 狠狠五月天| 一级久久性爱视频| 久久精品国产亚洲妲己影视| 亚洲天堂2020| 白嫩91在线亚洲| 天操老女人| 久久嫩草国产成人一区| 青青操青娱乐| 欧美日韩91| 欧美强奸一区二区诱惑| 少妇人妻好深太紧了vr91| 天天看天天日天天操| 国产美女自拍视频| 免费男人的天堂| 亚洲性图91| 神马久久久久久久久久| 日本淫色网| 五月婷婷综合网| 午夜国产成人福利视频| 激情五月天插| 操操操五月天婷婷丁香影院| 69超碰综合| 国产亚洲性生活视频播放| 色五月激情AV在线| 伊人伊人LD| 天天看人人操屄犊摸阴| 麻豆久久久久久久久丝袜| 色综合美国| 国产欧美日韩在线观看麻豆传媒公司| 欧美另类天堂| 情色五月天就去干| 51一区二区三区| 国产精品禁久久久精品| 色香综合天天影视综合 | 成人综合色网| 欧亚洲精品有视频| 熟妇高潮一区二区免费视频| 亚洲一区二区三区久久 亚洲一区二区| 超碰99在线| 亚洲男人天堂Av| 熟女人妻久久中文字幕一二区| 激情综合网激情五月天| 日本天天操| 婷婷色一区| 97青青操视频| 久久久18禁| 中文字幕人乱码中文字的预防方法| 日韩精品电影| 九九九九一区| 97超碰欧美| 久艾草在线精品视频在线观看| 免费精品国偷自产在线在线| 另类小说综合网| 强歼乱伦资源网| 五月激情视频| 日韩伦理视频| 成人欧美日超碰| 熟人人妻少妇精品久久| 色香AV| 亚洲国产精品99久久久| 日本视频在线观看污污污| 五月丁香影院| 操美女人妻| 丝袜色综合| 97欧美综合| 亚洲?V无码专区在线电影| 岛国艾薇凹凸视频天堂| 亚洲激情网一二三四区| 大香蕉中文aV在线| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 亚洲自拍欧美国产首页网曝| 99热日| 啊啊啊啊啊啊好多水| ji熟女.com| 美日韩在线不卡人妻| 欧美 青青草| 丝袜视频一区二区在线播放国产中文| q2午夜理论片夜色av| 久久久精品电影| 精品视频久久久久九九九九9999 | 色婷婷导航| 亚洲精品一二三四区| 亚洲中文字幕有码视频一区二区三区| 久久久中文版| 9久热这里只有精品| 国产黄片精品在线| 婷婷五月天_亚洲小说欧美激情另类_精品久久国产字幕 | 超碰 av 女人天堂| 九九九九亚洲| 国产AV毛片| 久久久9视频| 正宗无毛一线天嫩逼| 欧美日韩啪啪电影| 防屏蔽在线视频| 96精品一区| 在线有码中文字幕| 开心激情站| 高清肉丝中文无码| 亚洲精品久久久久毛片A片拉屎 | 亚洲999综合| 啪啪自拍九九综合| 久久人妻四季| 久久久国产成人一区二区三区在线| 亚洲天堂电影精品一区| 色婷婷一区二区三区久久午夜| 国产欧美在线观看免费观看| 五月丁香| 清纯唯美亚洲另类| 人人贴人人摸| 午夜精品久久999热蜜桃介男人用| 男人天堂欧美| 五月天婷婷色| 欲香欲色综合天天伊人| 黄色欧美性爱视频| 亚洲欧美在线综合| 久操网无码在线| 曰本熟女视频| 欧美福利视频啊啊啊啊 | 日韩精品-原创伙伴| 日本三级R| 99这里都是精品| 乱欲一区二区| 99re在线视频| 欧美日本中字另类在线| 天天插夜夜爽| 91在线视频观看国产| 日本大香蕉| 91精品久久久久五月天精品| 涩爱AV在线| 翔田千里爆乳巨臀无码| 第45页一区二区| 久久精品 六十路 熟女 欧美| 高凊专区人人操| 亚洲啪啪综合?v一区综合精品区| 国模限制级电影| 超碰97人妻| 大香蕉免| 天堂俺去俺来也www久久婷婷| 欧美少妇性乱| 全免费a敌肛交毛片免费| 91精品少妇搡搡搡| 日韩黄色成人性爱| 精品久久97| 欧洲无码一区二区| 午夜男女爽爽大片免费观看| 精品国产乱码久久久久久久久1| AV男人天堂网| 欧美成人国产精品| 人人超碰在线观看黄| 有码色中文字幕在线观看| 闷骚老熟女15P| 蜜桃狠狠色伊人亚洲综合| 九九亚洲视频| 超碰在线974| 飘花国产午夜精品不卡| 亚洲91大片| 久久性生大片免费观看性| 精品对白久久不卡| 淫荡网址| 玖色av| 日韩精品人妻| 大香蕉宅男伊人| 精品中文字幕一区二区l - 百度| 亚洲另类色综合网站| 欧美拳交在线播放| 黄色人人| 上床啊啊啊| 欧美色图私拍91| 国产精品久久久久久 百度| 久久久久久十| 成人热久久精品| 欧美刺激色黄片免费看| 青青在线视频日韩欧美| 久操网在线| 99热综合| 91精品久久久久五月天精品| 亚洲色图8| 亚洲淫乱骚妇AV| 伊人久久大香大香线蕉中文| 久久永久无码人妻视频| 五月天加勒比啪| 天天日日舔舔| 久久久久国产精品片区无码直播 | 丰满人妻一区二区三区四区| 78m啪啪啪| 精品久久九| 少妇蜜汁| 九月婷婷| 日韩一区二区三区四区五区 | 午夜久久一区二区无码中出| 91小视频| 无码区蜜乳| 色欧洲| 欧美综合综合| 亚洲系列欧美| 色天堂综合| 亚洲城人男人的天堂| 99热精品在线| 唐山老熟妇露脸啪啪叫| 性色av大全| av网站免费看| 久久久久久久9| 后入日本1234| 肉丝无码中文高清| 大香蕉一人在线| 欧美熟妇乱码在线一区| 亚洲欧美精品一区天堂久久| 日韩精品在线观看网站| 国产中文大片资源中文字幕| 黑人免费福利视频| 美女网站91| 高潮9999外国| 99色在线| 少好三P| 精品乱码在线观看| 日韩一级二级三级免费看完整版国语版 | 天堂蜜桃无码视频一区二区| 少妇国产不卡| 久久婷婷国产一区二区色| 国产精品电影| 97在线精品| 亚洲成人久久美女| 女同性恋久久| 天天干天天操天天干天天操| 操逼操逼逼操操逼91| 2017人人操,人人摸| 1级黄色夫妻对换性交免费看| 97在线观看| 97色碰| 日本阿v天堂在线观看| 婷婷五月天激情四射| 五月天亚洲色图| 91天天综合| 麻豆2区1区天美| 欧美强奸一区二区诱惑| 97超碰资源网| 天天澡天天爽日日av| 中文字幕神马久久| 综合久久99亚洲人妻中文在线| 另类av综合久久| 内射中国少妇高清视频免费视频 | 亚洲加勒比| 91国产操逼视频| 成人av性爱电影在线观看| 亚洲AV成人无码一二三久久| 最新国内自拍av免费| 大象AV在线| a天堂视频| 欧美另类精品xxxx| 人人天天干干| 丁香五月天社区| 婷婷伊人一区| 国产在线精品电影观看| 东北操逼| sewuyueav| 亚洲成人激情小说视频| 日本熟女免费視颖| 亚洲AV永久无码一区仙野| 国产亚洲一黄| 天天看人人操屄犊摸阴| 色色青青久久| 试看60秒 爽| AV和黑人在线播放| 最近的最新的中文字幕视频| 91狠| 中文字幕天天操| 亚洲校园激情| AV乱伦专区| 精品毛片久久久精品毛片| 国产九月婷婷| 色九九九综合| 丰满人妻-区二区三区免费看| 久久久新亚洲AV| 日韩 欧美 另类 人妻| 920日本午夜免费| 人妻在线大香蕉| 亚洲丝袜在线观看| 国产强奸乱伦xd| 可以看的av| 最新av在线| 日韩小电影| 精品亚洲黄色片 国产精品导航一区二区| 中文字幕在线观看视频www| 一区 欧美 日韩 麻豆| 五月天日日操夜夜操| 九九精品无码专区免费| 99自拍视频| 久草草一二三四区久久| 97超碰精品| 少妇滛荡视频| 麻豆成人av| 热99这里有精品综合久久 | 天久久久噜噜噜久久国产精品爽爽 | 色小视频蜜乳| 久偷拍| 91网站18| 五月婷婷激情网| 先锋激情∨在线视频播放| 色五月网址| 天欧美在线| 另类小说综合网| 大香蕉伊人亚洲| 国产精品久久久视频| 一区二区三区男女操逼黄色小电影| 亚洲九九视频| 99热99色| 激情一区二区| 99久久com免费视频′| 人妻久久一区二区三区| 东北夫妻性偷拍| 欧美人妻精品一区二区| 品亲网欧美品亲网| AAAAAAAAA黄片| 亚洲综合成人网| 国产精品国产精品国产| 91xingse| 上海一级黄片| 亚洲午夜精品久久久中文影院| 六月婷婷激情| 操婢日韩| 亚洲影院成人| 亚洲中文字幕乱码无码一区二区| 鲁鲁色综合网| 人妻碰碰碰碰碰碰| 澳门色噜噜色噜噜色噜噜色噜噜色噜噜| 亚洲欧综合另类无码一区| 欧美性生活内射| 精品人妻中文字幕4399| 欧美色图成人网一区二区 | 五月天黄色激情视频| 日日夜夜模| www.久久最新地址| 亚av顶级裸体一区二区三区四区五区| 性爱视频免费网址| 97超碰逼| 亚洲精品性爱片| 九九国产| 99久久精品国产高潮| 久久是精品| 日韩精品中文字幕二区| 综合网亚洲在线| 日本欧美成人片AAAA| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 无码国产精品96久久久久孕妇| 99re国产精品视频| rivers-china.com| 99在线观看无大码| 久久久蜜桃一区二区三区| 老熟妇乱轮| 国产搭汕a级片| 久久9免费视频| 亚洲AV色图一区| 97国产精品久久久久| 亚洲天天影视色综合| 亚洲欧洲色情高清| 欧美色日| 97国产中文| 久久激情视频| 素人一区二区三区日韩| 日韩少妇无码| 色臀AV| 岛国小电影| 色情综合| 亚洲精品日日夜夜52| 亚洲国产成人福利在线观看| 婷婷丁香五月综合| 中国熟妇| 精品v1区| 久久婷婷综合国际产色怕| 美欧色综合| 男人 天堂 日 亚洲| 立川理惠无码一区二区| 老熟女网站| 欧美大片一区二区三区| 五月丁香婷婷色| 人人摸.人人色| 麻豆天天躁天天揉揉AV| 日本九九久久99播| 99热只有这里有精品| 色综合加勒比四四季| 嗯~啊~快点 死我视频免费看网站| 欧美日韩国产中文超碰| 伊人操操| 97色网| 黄色片大香蕉| 啊啊啊啊二区好大| 亚洲毛片基地专区| A 天堂在线观看视频| 超碰天天久久79| 欲香欲色| 很很热性爱视频| 久久久久久久久久久久黄色| 最近2019中文字幕国语免费版| 美女爽到高潮91| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 欧美 亚洲 在线| 91丝袜美腿片| 亚洲天堂另类小说男人| 日本人妻A片成人免费看片| 超碰人人操97碰| 男人的天堂2019| 91超碰在线观看| 欧美aⅴ99久久黑人专区| 天天日夜夜| 乱伦系列一区二区| 欧美狠狠干| 国产家庭乱伦性爱视频| 久久久久久九九九| 青青草中出视频| 亚洲综合69| 久久骚少妇| 少妇一区二区三区在线观看| 天天爱天天韩国日本牛牛牛牛| 日韩,欧美,中文在线| 欧美黑人精品在线播放| 日韩免费高清大片在线| 国产一区在线播放| 蜜臀99久| 亚洲欧美清纯| 熟女少妇视频| 欧美色97| 久久大香蕉97| 日韩射图| 男人天堂毛片| 日韩电影中文字幕| 日本一卡二区在线| 亚洲中字慕不卡| 久久精品国产97欧美精品亚洲| 少妇高潮喷水无套久久久久久| 欧美熟女丝袜| 欧美综合 站| 丝袜狠狠草尤物 91| 天堂涩涩| 久久久熟女一区| 97人妻人人躁人人玩人人| 丰满欧美放荡少妇在线| 亚洲伊人青青草| 欧美日韩小说| 亚州综合AⅤ| 色色色综合网| 亚洲国男人的天堂| 欧美天天拍| 熟妇最新先锋一二三区| 有码人妻系列| 91成人在线| 91美女色视频亚洲| 91精品久久久久久77777| 中出人妻中文字幕91在线| 中日韩久久久免费看| 巨乳特殊服务按摩| 色悠久| 国产狂喷潮在线精品| 奇米四色影视777久久久|