亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

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è)計標(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)驗(yàn)一層層拆開這個看似簡單、實(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ù)——因?yàn)檫@會把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%。因?yàn)槊總€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)。第三驗(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()生成測試報告標(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)第一個具體策略——高斯模糊我們選擇高斯模糊作為首個策略因?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ù)計算高斯核避免每次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計算錯誤導(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ū)編譯報錯“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)一編譯選項(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)行時計算高斯核、卷積權(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
返回資訊列表
亚洲人妻五月丁香婷婷| 国产一区二区三区不卡手机在线| 啪啪视频免费在线观看| 久久综合久色欧美综合狠狠 | 国产精品4p在线观看| 日噜夜夜夜夜夜夜夜夜夜夜爽爽爽爽爽爽爽爽爽爽爽爽 | 成人三一级一片aaa| 色噜噜国产精品视频一区二区| 在线视频一区二区传媒| 天堂av2019| blacked精品一区国产| 欧美激情在线观看视频| 日日干夜夜欢| 亚洲一本色码中文字幕| 2001天天操| www.色婷婷| 视频黄色国产一级| 黄视频免费| 男人的午夜天堂| 久久九九精品一区二区| 日本淫穴在线| 好吊色一区| 激情网五月天| 亚洲情色第一页| 久久性爱城| 青青操轻轻| h4610国产人妻| 日韩高清黄片| 日韩无码精品综合久久| 欧美五十路熟| 色狠狠 - 百度| 日韩熟女三十乱伦| 成人七区| 91麻豆va国产精品| 激情视屏国产乱伦强奸| 精品v日韩欧美国产| 国产黄色小视频网站| 精品对白久久不卡| 无码一区免费在线不卡| 午夜激情成人在线观看| 中文字幕123| 免费看欧美美女黄色大片| 国产一区在线免费播放| 静品嫩模一区二区| av优播| 日韩人妻少妇 一区二区三区| 亚洲国产成人精品无码专区| 精品伊人久久久大香线蕉小说| 天天躁日日躁xxxxx| 国产精品999zyz| 天堂中文资源在线bt| 久久无码电影| 热天堂一区二区| 久久亚洲不卡一区二区三区| 欧美亚洲厕所精品偷拍91| 国产成人主播| 欧美专区17页| 麻豆成人影音在线| 老熟妇一区二区三区…| 久久婷婷热| 午夜激情床戏激情| 国产精品久久久九九九| 欧美图片校园春色| 99久久精品无码一区二区毛片免费 | 人妻中文字幕精品无码| 九九无码视频| 亚洲限制级| 中文日韩欧美熟| 欧美春色| 91影库| 中文字幕在线免费观看视频| 99九九久久| 91AV天美在线视频| 国产午夜在线观看| 欧美性爱伊人| 青青草手机在线免费观看| 天天天堂影视日韩亚洲91| 日韩BBN| 色色毛片| 欧美精品第3页| 美女网站黄页| 看大黄色大片原件| 超碰激情808| 久草在| 亚洲一区在线观看欧洲| 日本国产成人亚洲精品无码| 色偷偷色偷偷欧美日韩| 亚洲字幕一区二区| 一本大道综合伊人精品热热| 国产精品一区二区三| 中文字幕精品一区欧美| 中文字幕啊啊啊在线观看视频| 96国产污污污丝袜| 久久国产免费激情视频| 熟妇艹鸡八| 大色网久久| 91视频精品| 日韩啪啪啪啪啪| 嫩草 我啊~嗯~在线| 人妻丰满熟妇一区二区三| 熟女精品一区二区三区| 少妇蹲下买菜露大唇0| 日本性爱视频一级| 中文一区二区婷婷视频| 亚洲欧美碰碰| 色婷婷五月综合激情中文字幕| 最新中文字幕av| 新亚洲无码| 欧洲熟妇xxXx欧美老妇裸体 | 亚洲激情网| 天天操天天日青青草超碰av| 操逼啊啊啊91| 亚洲性感丝袜诱惑在线观看| 国产真实野战在线视频| 欧美91久久久久| 免费1级a做爰片观看| 久久精品人体AV| 新怡红院| 亚洲欧美精品91| 亚洲图片 欧美电影| 伊人五月天| 一本色道久久综合狠狠操| 国产精品 午夜福利| 四虎免费在线播放| 日本亚洲熟女视频| AV中亚| 日韩AV一区二区三区四四| 久草毛片| 九九色图| 97超碰超| 操我啊啊啊啊啊| 亚洲天天在线| 亚洲资源网| 久久久久国产精品喷潮免费观看臀| 亚洲人久久久网| 日日噜噜夜夜狠狠视频无| 人人超碰在线观看黄| 中国AV美女| 99久在线精品99re8a| 欧美成人四级在线播放| 97精品人妻一二三四| 亚洲精品a人片在线观看视| 日本高清加勒比| 国产高清MV操逼视频| 蜜桃精品视频一区二区三区| 大香蕉520| 色网亚洲人| 一级乱伦网站| 麻豆蜜桃视频在线观看| 欧美色性爱| 久操免费电影| 欧美72网页| 大香网站| 国产精品96| 97 国产一区| 超碰成人公开| 97超碰精品图片| 亚洲精品欧美专业| 日本午夜福利影院| 免费福利视频中文字幕| aV中亚| 欧美亚洲成人在线一区二区三区| 色五月激情综合网| 欧美另类综合久久| 91精品人妻| av情色影音| 性爱乱伦网址| 秋霞网无码| 精品二区三四区五电影| 人妻天天爽夜夜爽爽| 97精品熟女少妇一区| 99少妇内射| 亚洲自拍欧美国产首页网曝| yazhousetuoumei| 偷窥自拍A片| 天天看天天日| 亚洲性高潮| 和协影院中文字幕三区| 青娱乐蜜桃臀AV色婷| 人妻熟女午夜精品在线| 久久久无码国精品无码三区三区| 久操网视频| www.yw尤物| 人人干黄色| 超碰色97| 欧美天堂在线| 欧美性夜| 亚洲色性| 无码二级三级| 好爽要喷了| 东北操逼| 男人天堂久久精品不卡| 动漫av中文| 麻豆区99999| 中文字幕成人| 女优视频第10页| 亚洲精品日日夜夜52| 亚洲伊人a线观看视频| 天美传媒精品一区二区| 亚洲欧美不卡线| 97欧美日韩精品| 欧美黑人168页欧美黑人167| 欧美后入式| 五月婷久久| 欧美日韩黄色片一区二区三区四区人与兽做爱 | 日人妻视频91| 啊啊啊网站| 久草电影网| 中文熟女五十乱码在线| 精品国产乱码久久久影院| 超碰在线第一页| 欧亚免费视频| ,成人免费啪啪视频| 午夜后入| 第四色色综合91| av天堂手机版追回| 天天天天操| 久久五月视频| 夜夜操夜夜爽夜夜高潮| 蜜臀久久在线视频| 97频视在线| 91无码人妻| 2019亚洲男人天堂| 啊啊啊无码| 国产精品96| 女性喷水高潮在线观看| 亚洲一区日韩精品| 草草影院日本第一页| 成人无码在线超碰网| 日本人妻中文字幕精品| 狠狠中文字幕| 99人人干| 97亚洲一区| 欧美狠狠弄| 国产青青美女玩逼视频| 男人天堂2017| 欧美一级A片不卡视频。| 日本午夜久久电影| 亚洲人在线| 日韩欧美中文字| 亚洲色婷婷综合久久一区二区三区| 偷拍自拍在线视频观看| av天天在线观看| 国产农村妇女精品一| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 日韩国产在线观看av| 伦理片秋霞免费影院| 亚洲综合色男人网| 色呦色呦色精品| 91狠狠综合久久| 久久久久久亚洲Av无码| 五月丁香六月婷| 狠狠热这里都是精品| 超碰久在线天天做| 91bbb| 亚洲国产奇米影视久久| 嗯嗯嗯好爽| 美女黑人91神马| 三及片网站| 日韩免费高清大片在线| 久久熟女人| 超碰9 7女人| 被窝影院午夜看片无码| 91热爆在线| 久草综合视频| 97天天| 亚州AV无码国产精品| 一区二区三区 丝袜 高跟 美腿| 91综合国产精品| 国内外内射高清视频| 国产精品一区二区 尿失禁| 蜜臀精品1区2区| 精品一级| 亚洲色五月| 国产精品午夜福利视频| 99久久精品无码一区二区毛片免费| 99在线免费观看| 男人天堂免费| 国模少妇一区二区三区 | 亚洲成人性爱在线观看| 亚洲欧美日产国产91毛片| 天天综合~91| 亚洲精品一二三四区| 风韵犹存大大大大香蕉| 欧美极度丰满熟妇hd| 色www精品视频在线观看| 日韩成人私密一级精品av| 欧美日韩99| 亚洲人码13| 在线看片国产精品每日更新| 九九九九97| 91搞逼视频| 91色噜噜狠狠| 嫩草在线视频| 亚洲国产成人精品久久久国产成人一区二区| 日本视频在线观看污污污| 91美女视频在线| 100啪啪视频大全| 蜜桃中文字日产乱幕4区| 操碰97| 国产老熟女| 日韩强奸av| 日产中文字幕2020| 岛国毛片在线观看免费| 超碰97久久国| 能看的AV| 亚洲福利影院一区久久| 日韩丝袜高跟制服在线观看| 午夜偷拍久久熟女| 九九九九一区| 中文字幕精品人妻丝袜| 国产午夜激片Av毛片不卡| 久久视频,这里只有精品| 亚欧视频在线| 中国91AV| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 亚州AV无码国产精品| 中文字幕伊人| 中文字幕日韩综合| 午夜福利1区2区3区| 中国黑人三级片网站上区| 免费伦费视频在线观看| 啊啊啊啊无码| 传媒免费一区二区三区| 亚洲1区| 亚洲国产丝袜熟女av| 欧美熟妇人体| 欧美色综合影院| 亚洲欧美清纯| 另类欧美| 久久爽爽精品| AV电影在线播放| 国产强奸乱伦无码视频| 日韩中文字幕宗合在线| 日本 欧美 亚中文字幕| 欧美性生活免费网| 蜜臀99久久精品久久久久| 欧美色图成人网一区二区 | 熟妇熟女一区二三区| 美女极品一区二区三区| 日本男人天堂| 熟女91网| 欧美性生活内射| 裸体美女免费看网站青草| 亚洲无无码αⅴ每日更新| 亚洲国产精品有声| 超碰97中文| 日韩精品国模| 60秒免费小视频| 久久99热这里只频精品6学生| 欧美成熟性爱精品| 亚洲无码精品AV久久久| 中文字幕国产| 九九国产| 中文字幕片| 国产超碰在线| 凹凸视频特色日本特黄| 免费中文在线| 欧美精品99久久久**| 久操电影| 亚洲天堂男人天堂网| 伊人在线大香蕉视频久久| 日韩欧亚太美不卡| 日本天天吊| 天天综合色| 日本性爱少妇| 日日爱99| 最新日韩黄片| 中文字幕丰满人妻日本| 欧美天天谢综合网| 91色射| 97色色视频| 国产精品成人久久一区二区三区 | 欧美夜夜狠| 婷婷丁香五月综合| 色噜噜狠狠色综合日日| 大香蕉手机在线| 色黄色美女大长腿午夜视频| 天天干18禁| 乱色老一区二区三区的观看方式| 嗯嗯啊啊操死我| 人、人、摸,人、人、草| 亚洲黄色电影| 欧美色日| 欧美亚洲一区二区久久久婷精品大包诱| 97天天日| 99少妇| 亚拍在线| 91高清日| 亚洲精品人体| 大二网站亚洲| 欧美色视频在线| 最新岛国大片| 第一高清av中文字幕| 国产精品午夜高潮呻吟久久av| 麻豆国产96在线| 97人人超| 艳美熟妇先锋一二三区| WWW.加勒比人妻一区不卡.com| 综合天天网| 亚洲色情在线影视| 热热色中文无码| 亚洲中文字幕熟女| 亚洲欧洲精品视频发布| 天天日天天色| 久久天天躁日日躁狠狠躁 | 欧美色狠| 色噜噜精品一区二区三| 人妻少妇久久中文| 欧美96在线|欧| 蜜臀无码视频在线观看| 精品国产丝袜一区二区三区乱码| 成年人性爱日韩| 国产99 中文字幕日韩小视频| 91爽啪| 热久久九九热| 蜜桃传媒视频第一区入口在线看| 中文字幕国产在线天堂| 操逼视频免费日韩无码| 淫淫总合网| 91欧美丨精品丨入口| 欧亚 另类 久| 免费成人在线观看91| 久久人人舔人人爽舔人人av片| www激情| 啊啊啊好舒服好爽啊啊啊视频| 亚洲色图综合网| 久久久不卡| 国产人妖的免费的视频| 亚洲综合色网| 国产精品对白自产拍| 人人操,人人液| 久久精品国产亚洲AV片多多| 超碰97资源大奶| 97精品人妻一二三四| 亚洲日韩在线a不卡99精品| 99精品成人免费看| 99操| 亚洲天堂欧美| 久久激情视频| 日本免费一区二区不卡| 日本操逼视频不卡直接放| 久久婷婷伊人| 国产精品97超碰| 99re免费视频精品全部| 九九热九九热| 日韩三级伊人| 俺去久久| 黄色视频高清无码网站| 日本一区三级韩国| 日韩一卡二卡三卡| 91操碰| 亚欧美色图| 中国一级特黄大片护士| 中文字幕片| 97在线视频免费观看| 丁香五月性爱| 国产白丝AV| 99日精品欧美国产| 国产自啪精品视频网站黑丝| 国产精品亚洲无码| 日韩精品99久久久久久中文字幕 | 日本 成 人 小说 电影 一区二区| 天天综合站| 精品国产丝袜一区二区三区乱码| 九九九九日本| 99国产精品视频尤物| 国产av青草| 在线a亚洲视频播放在线| 后X久久| 精品国产乱码久久久久久蜜臀| 中文字幕精品区先锋资源| 天天操人人操骚逼网站| 永久免费发布性爱网| 999综合色| 欧 美 自 拍 偷 拍| 一牛一区二区三区久久| 亚洲另类小说卡通动漫| 久久久久人| 手机看片1025| 天美传媒婬乱在| 国产农村妇女一区二区| 伊人网青青| 婷婷美人网| 日韩av一级黄片| 综合熟妇一区二区三区| 丝袜 亚洲 偷拍| 亚洲高清视频在线免费观看| 久久欧洲| 久久久精品国产亚洲AV无码| 久草在线| 天天影视色香色欲| 精品无码产区一区二| 久久久久久久久久va| 美女91网| 婷婷爱五月| 18一区二区三区| 中国一区二区亚洲人妻| 国产精品国产自产高清AV| 啊啊啊好疼| 麻豆蜜桃视频在线观看| 俺去久久| 亚洲综合激情五月久久| 亚洲人妻一区二区三区| 亚洲天堂,男人| 黑人干亚洲| 五月婷婷激情综合| 人人摸人人干| 国产91av在线播放| 激情文学小说一区二区| 亚洲天堂,男人| 久久草草亚洲蜜桃臀| 日本中文字幕熟妇| 欧美最婬乱婬爆婬性视频| 国产对白刺激视频| 超碰在线免费一区二区三区| 91亚州欧美| 五月婷婷久久综合| 国内偷自视频区视频综合| 国产夫妻性生活视频| 久久综合乱子伦国产免费| 人人摸人人干人人拍97| 人人看黄色视频| 97人人夜| 五十路人妻在线| 偷窥自拍亚洲色图| 婷婷丁香五月激情啪啪| 俄罗斯一区二区视频在线观看 | 色www精品视频在线观看| 婷婷综合视频| 亚洲操逼视频网站| 老司机天天操| 国产精品精品系列在线观看| 欧洲亚洲人妻无码高清久久三区四区| 欧美 日韩 另类 亚洲| 成人日韩欧美| 爽 好舒服 无码刺激久久| 国内偷自视频区视频综合| 亚洲成人贴图| 97伦综合| 嗯~啊~轻一点 视频| 婷婷五月天无码| 男人下部插入女人下部 | 在线视频资源| 中文字幕黄色一起草| 国产精品久久久久久久久久久久久久久久| 99re3这里只有精品| h在线看免费版在线看| 亚洲经典啪啪| 亚洲福利中文字幕在线| 亚洲精品中文字幕一区在线视频| 思思热久久成人| 一级@啪啪视频| 9国产超碰| 日韩欧美大片免费高清啪啪| 免费精品国偷自产在线在线| 91色综合| 1000部熟女视频在线观看| 国产精品日日摸夜夜添骚逼| 五月丁香激情四射| a男人的天堂久久一级A毛片| 亚洲一区中文精品| 国产精品 久久久精品一牛| 精品国产91av一区二区三区| 国产对白刺激视频| 一级特级aaaa毛片免费观看| 91精品啪在线观看国产城中村| 久久精品店| 亚洲欧洲国产综合av| 亚洲中文字幕精品久久久久久直播| 日本精品高清一二区一本到| 偷窥自拍亚洲天堂网爆| 狠狠爱综合网| 女同亚洲欧美一二三区久久电影| 高潮内射在线| 大香蕉在线视频重口味毛片在线| 综合97亚洲| 偷拍亚洲情色| 国产一级高清免费观看| 国产视频一区二区三区在线免费观看 | 欧美性爱第一页久久| 久久欲| 国精精品无码一二三区水多多| 日韩一区二区三区四区五区| 99激情视频| 天天综合精品| 欧美综合 站| 东京热,男人的天堂| 69一区二区三区| 免费自拍三级综合| 另类小说五月天| 嗯嗯啊啊操死我| 91无码人妻| 97色香蕉| 黑人白女精品一区| 亚洲综合五月天| 日少妇亚洲版| 婷婷人妻激情| 激情 欧美 亚洲 小说| 3p国产欧美99热| 啊啊啊啊啊啊啊国| 久久r精品| 搡老熟女免费视频| 亚洲操人| 欧洲精品网| 精品国产乱码久久久久久网站入口| 欧美性爱日韩高清| 91操人| 久草综合视频| 尤物网站91| 一区二区娱乐网站| 国产精品丝袜久久亚洲不卡| 99re这里只有精品9| 天堂中文资源在线bt| 99999精品视频| 精品少妇高潮久久| 成人性爱视频在线看| 无码99| 国产91美女视频| 18禁的网站在线| 超碰色中文| 校园春色AV天堂| 欧美日韩性爱无码| 歐美性天天| 最新国产精品| 九色97| 91国产丝袜白虎| 激情视屏国产乱伦强奸| 日夜久久久九九九久| 9丨久久九九九| 无码少妇精品一区二区60岁老人| 91在线/欧洲| 国产一区二区三区白丝| 伊人青青一区成人视频在线观看区| 后入人妻无码| 欧美视频在线视频免费va| x97av| 久草免费福利在线播放| 美女诱惑在线一区| 欧美日韩大黄片| 蜜桃视频精品一区二区三区| 国产免费黄色一级大片| 欧美美女自慰一区二区三区| 天天干嫩逼网| 精品一区二区3区| 久久久久久九九九| 伊色综合天堂色97| 国产又黄又爽| 97激情97激情| 欧美一区二区一级岛国大片| A啊啊在线观看| 日韩无码精品综合久久| 青青草色情网站视频| 激情天天视频| 日韩欧美水蜜桃人妻| 日本免费中文字幕在线| 中文久久96| 国产亚洲日本精品在线| 蜜臀99久久精品| 亚洲五月婷| 亚洲AV秘 精品久久老牛影视| 97精品97| 亚洲AV成人无码久久精品播放| 久久国产精品视频| 无码又爽又硬又激情免费视频| 九九热三级片| 久久婷婷在线观看视频| 强奸乱伦AV网站| 曰本特级特黄特色黄色A级网站高清在线免费看| 欧美顶级黄色大片免费| 骚日日av| 啊啊啊啊啊啊啊国| 91人妻最真实刺激绿帽| 蜜臀无码一区二区| 男人的天堂2010| 亚洲成人精品在线一区| 内射中国少妇高清视频免费视频 | 亚洲在线综合| 天天综合AV| 日韩久久.一级黄色片| 91精品91久久久久77777| 青青草视频久久| 国产无码高清操逼视频| 欧美,日韩,中文,另类| 97九色人妻| 亚洲精品xxx| 欧美乱欲| 男人的天堂在线| 可以看的av| 国产精品蜜臀久久久久无码AV| 欧美色图自拍| 中文字幕日韩精品一区二区三区| 久久久久国产一区二| 欧美性xxxxx狂欢| 伊人午夜福利视频| www.操| 在线国产探花| 一级二级三级黑人无码| 97超碰精品图片| 99蜜桃臀亚洲成人在线观看| 调教熟妇 久久久久久| 天天色,天天干,天天干| 国产精品视频在线观看| 91欧美综合在线| 97视频在线观看播放与子乱对白在线……| 在线国产福利网址导航| 国产精品电影大全| 欧美色亚洲色| 精吧天堂| 韩国三级三级BD在线| 色99色| 超碰人人超在线观看| 91人妻最真实刺激绿帽| 久久精品人妻一区| 97se亚洲综合自| 午夜精品久久久久久久| 亚洲自拍一区夜夜操| 亚洲欧洲视频小说在线观看| 久久怡红院| 日韩去日本高清在| 久久精品毛片免费不卡| 9丨亚洲一区二区在线| 国产精品扒开腿做爽爽爽视频| 激情文学亚洲| 欧美中字不卡| 欧美日韩亚洲电影| 啊啊啊不要啊啊受不了了视频在线| 9久综合网| 无码色| 婷婷五月色| 午夜色婷婷| 国产精品成人无码av| AA特级绝黄| 黑丝自慰喷水网站| 欧美 日韩 亚洲 春色| 色在线综合| 国产多人在线观看视频| 99久久亚洲精品无码毛片潘甜甜| 综合97| 亚洲网站一区二区在线| 91美女视频| 国产精品不卡高清在线观看| 极品销魂美女一区二区| 久久精品国产亚洲AV先锋| 黑人娇小av在线播放| 亚欧色图在线激情| 黑人精品XXX一区一二区| 国产精品一区二区手机看片| 国产AAAAAABBBBB| 在线综合 亚洲 欧美中文字幕| 成人一级性爱| 在线观看亚洲专区| 3p国产色噜噜一区| 91超级碰| 大香蕉伊人一区在线观看| 一区二区三区四区五区高清无码永久视频 | 亚洲五区熟女| 91少妇香蕉久久精品| 91青青在线视频| 97网站在线观看 | 日本三级中国三级99人妇网站| 超碰三级秋霞| 97 视频在线| 99蜜月精品久久| 91美女在线| 操逼无码操逼| 五月天玖玖资源站| 天天综合色| 成人日本精品九区| 天天天堂影视日韩亚洲91| 亚洲高潮影院| 最近2018中文字幕在线高清第一页| 免费观看国产小粉嫩喷水精品午| 成人免费不卡在线视频| 一区二区三区四区色图| 欧美熟女妇同| 快播电影网日韩新片| 麻豆久久精品亚洲精品88| 91香蕉视频在线观看免费| 精品一区二区成人动漫| 精品国产网站| 色婷婷一区二区三区久久午夜| 亚州色综合| 日韩欧美成人性爱在线| 99热精品在线观看| 欧美日动态视频| 一二三区精品视频| 1级午夜影院费免区| 大香网伊人久久综合| 久久久穴999| 日本二三四区| 色色香蕉| 日韩中字av一区| 91精品操美女| 国产日产精品久久快鸭的功能介绍| AA丁香综合激情| 亚洲色悠悠久久88| 免费观看成人www精品视频| 大香蕉黄色一区| 99色婷婷中文字幕乱色| 亚洲丝袜少妇在线| 中国一区二区亚洲人妻| 日韩熟女精品无码专区一区二区| 少妇九九九九| 大香网站| 一区二区三区蜜桃成人撸久久东京热| 久草看看看| 色婷婷九月天天综合| 久久久性爱视频| 97在线免费视频| 欧美在线视频99| 91欧美巨乳| 日本精品无码三级网站| 欧美性爱一区| 秋霞Av理论一级在线| 91久久久久久| 一本色道久久综合狠狠操| 亚洲欧美自拍偷拍| AV天堂男人的天堂| 午夜性生活av免费在线看| 婷婷五月天在线观看| 九九久精品| 亚洲强奸乱伦影视网| 99黄页网站| 欧美1区二区三区公司| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 久久久日本电影| 日本女人操逼| 激情婷婷丁香网| 92午夜免费福利视频| 91精品国产乱码| 日韩一区二区高清在线观看的| 日本黄色裸日本黄色裸体| 美国日韩黄片| 欧美 青青草| 91看黄片| 性爱欧美五月| 日韩色| 人妻无码视频一区二区三区久久| 强奸乱伦Av网| 一区超碰一区| 丁香九月激情| 精品午夜福利| 99国产精品在线观看| 精品国模无码| 淫骚熟女一区二区三区| 天天操夜夜嗨| 国产精品高朝久久久久久久| 黄网色一区二区三区四区精品| 91黄射| 盗摄 精品 另类 一区| 91天天综合日韩欧美| 欧美中文字幕男人天堂久久精品| 在线日韩精品一区二区三区| 亚州色站 日韩电影| 日韩性爱毛片操骚逼| 伊人在线大香蕉视频久久| 国产成人网站在线观看| 久久人妻熟女一区二区 | 九九碰九九爱97超碰| 91嫩草欧美| 亚洲二区精品在线观看| 亚洲欧美在线丝袜| 东北女人av| 欧美日韩日产免费网站看| 欧美亚洲韩国视频十五区| 丁香五月综合| 五十路六十路七十路熟婆| 日韩精品一区,二区 九九...老司机| 久久久久9| 香蕉国产精品麻豆亚洲欧美日韩| 国产精品久久久久久久久久久久久久久| 3p国产色噜噜一区| 亚洲九九九| 老熟女中文字幕高清| 五月综合久久| 九九精品99| 东京太热男人的天堂久久久| 日韩在线人妻网站| 久久婷婷综合国际产色怕| 欧美日韩97| 天天综合网~91综合网| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 麻豆一区在线| 六月色婷婷| 中文字幕亚洲永久精品| 青娱乐啪啪视频| 日韩精品电影| 丝袜夫妻自拍| 另类专区在线观看| 国产成人精品必看| 国语少妇精| 美女网站黄页| 欧美激情超碰777| 色色婷| 国产 热久久久久国产精品| 91黑丝在线| 超碰 欧美| 狠狠2050在线观看| 丰满人妻一区二区三区在线| 手机看av网站在线看| 免费看黄片现成| 国产400孕妇孕交群| 91在线国产后入风骚翘臀美女素人| 欧美日韩免费专区在线| 超碰国产在线| 亚洲天堂7777| 老司机天天操| 亚洲无码电影久久久| 天天操妹子| 后入式999| 噜噜噜亚洲精品| 青青草伊人久久| 麻豆 欧美 日韩| 天天做天天爱天天爽| 久久肏大逼| 成人 日本A片无码8888| 亚洲精品白浆高清久久久久久| 啊啊啊想要| 国产综合久久久麻桃个 | 六月色色| 欧美黄色片AAAAA| 在线观看国产黄色| 天天视频综合在线观看视频| 国产一区二区三区视频在线看| 成人一二| 被窝影院午夜看片无码| 午夜舔阴达高潮视频免费看| 婷婷久月| 欧美亚洲91| 91丝袜在线观看| 免费观看一区| 丁香七月婷婷| 操逼网站网站| 亚洲一区日韩精品| 国产成人 综合亚洲 天堂| 国产欧美日本亚洲精品| 被窝影院午夜看片无码| 久久久久久99AV无码免费网站| 精品免费视频国产一区| 亚洲欧洲中文日韩女优乱码| 欧美A片中文字幕| 色欲三区| 欧美成人AⅤ大片在线观看| 熟女五十路一区二区三| 粉嫩粉嫩一区性色AV片| 中国国国产一级特黄毛片| 精品一二三区久久AAA片| 国产麻豆一级精品视频| 丁香色色网| 久久久久久久久久久六六| 天美精品av| 人妻一区久久二区三区色播| 美日韩在线不卡人妻| 人妻激情在线视频| 999热日韩精品| 欧美 亚洲 第一页 | 女人天堂AV五区在线| 欧美亚洲第1页| 一区二区三区成人 | 欧美黄页在线| 伊人国产视频| 日本久久久精品电影| 啊啊啊免费| 亚洲熟女乱色一区二区三区| 国产不卡免费在线视频| 午夜精品视频777| 日韩AV一区二区三区四四| 91红杏| 99re在线视频这里只有精品| 欧美色网络| 久久久精品91八戒| 亚洲欧美日韩精品久| 91爱综合| 青青伊人加勒比海| 国产精品久久蜜乳av| 日逼逼免费看| 天天爽天天操| 黄日韩| 麻豆成人影音在线| 中文字幕一二区二三区人妻专区| 秋霞视频一区二区| 天天综合有色网| 97操97干| 亚欧免费| 亚洲麻豆精品二区三区| 九九九九九精品十六| 欧美色视| 日本国产欧美高清在线| 亚洲人精品久久久喷水| 狠狠干2020| 成人一道本免费视频| 久操不卡视频| 性老妇一区二区三区| 国产伊人精品在线| 岛国色情视频在线观看| 国产乱码久久| 极品出轨视频网站| 国产家庭乱伦性爱视频| 男人的天堂2019AV| 我想要啊 啊 啊| 亚洲天堂五月天国产| 天天综合色| 91熟女少妇| 日韩性爱毛片操骚逼| 天堂九九九九九九九九九| 欧美线天码中字| 欧美日韩亚洲一区二区在线观看| ′ !γ}丶。。久久精品欧美一区二区三区| 2017天天透天天通天天擦| 日本国产欧美一区三区二区 | 丝袜足交视频| 中日高清无码操逼视频| 日韩欧美资源| 青草草免费网站av| 日韩 人妻 精品| 久久春色| 五月天婷婷色| 少妇的嫩逼图片| 精品超碰国产| 五十路成人在线视频二区三区| 亚洲第一精品在线视频| 久久久熟妇熟女国产| 国产精品黑人一区二区三区| 欧美嫩性色| 国产精品96久久久久久| 大香蕉九九| 五月天婷婷社区| 91操操| 91女日逼| 99热这里只有精品8| 青女偷拍网| 99综合视频| 不卡视频一区蜜桃视频| 九九热AV| 久久激情婷婷| 欧美色偷拍 | 亚洲免费97免费| 操逼大黄片| 人妻熟妇久草在线| 3D污黄视频在线观看| 无码操逼天堂| 日本精品不卡一二三区| 日韩特一级久久| 人人透人人操| 亚洲高清欧美总合| 国产在线76页| 最新亚洲黄色免费电影| 青青草在线视频人人想人人上| 亚洲精品国语在线播放| 嗯嗯啊啊用力视频免费| 嫩草美女久久| 在线情色电影 91大| 欧美三级中文字幕hd| 久久三区四区| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 超碰97玖玖爱| 美国美女AV在线| 国产丝袜美女在线一区| 国产乱人妻精品入口| 国产精品蜜乳AV| 91制服丝袜| 日本一区二区三区欧美日韩中文字幕| 蜜臀无码视频在线观看| 91成人社区| 激情专区综合| 91在线免费精品视频| 国产乱码精品久久久久久| 国产精品蜜乳AV| 91丝袜视频在线观看| 热天堂一区二区| 无码操逼网| 婷婷午夜清品久久久久久久性色视频观| 九九热免费国产视频婷婷伊人五月| 精品国产91内射久久| 国产乱不卡| 爱爱动态120秒| 五月婷网站| 一本久道久久综合狠狠爱一密臀精| 狠狠搞 亚洲91| 中国探花熟女| а√天堂资源官网在线资源| 看看日B真人视频| 91久久精品国产| 亚洲国产欧美一区二区潘金莲| 福利视频香蕉免费一区二区在线| 91黑丝美女| 欧美婷婷五月天| 国产精品一二三区18| 日本 情色 1区2区3区| 激情五月天校园春色网| 亚洲熟女一区二区| 亚洲91色在线| 搡老熟女老女人老熟妇免费视频| 草草草视频在线免费看| 一本色道久久综合狠狠操| 国产白嫩精品久久| 色情五月综合婷婷| 午夜超爽| 国产精品美女视频诱惑| 在线观看啊啊啊啊啊| 97露脸精品丝袜| 天天做天天爽| 亚洲天堂7777| 亚洲欧美精品国产一区二区| 亚洲男人天堂手机版| 制服丝袜第二页| 欧美亚洲丝袜美女电影| 日韩午夜啪啪视频| 神马久久久久久伦理片| 97在线观看| 亚洲欧美97√| 亚州大图综合色图| 国产精品91ai| 精品久久在线区一区| 激情丁香五月婷婷| 另类一区| 青娱乐国产盛宴视频| 人妻无一区二区三区| 日日爱99| 屁股久久久久久| 美女91网| 五月天日日操夜夜操| 亚洲 另类 丝袜 自拍 动漫| 欧美大香蕉在线观看| 蜜桃久久一区二区三区| 亚洲图片偷拍视频区| 免费看A片毛毛片在线播| 国产一区二区三区视频在线看| 欧美高清18A片| 伊人国产成人av网站| 精品九九九九九九| 亚洲色图A| 熟妇人妻精品一区二区| 欧美三级偷拍| 亚洲97资源| 竹菊一区二区三区AV线| 国产丝袜高跟美女av免费观看| 人妻熟妇久草在线| 精品二999| 黑人精品久久97| 国产视频小说| ...日韩成人一区二区三区字幕| 亚洲污污网站| Aa东京男人的天堂| 综合性视频99| 91熟女视频网| 青青草原香蕉日本Ap| 极品色综合| 九九久久久| 欧美色999| 久久久国产av美女私房| 三级AV入口| 亚洲图片欧洲图片aⅴ| 天天色综亚洲91污| 日韩中文字幕二区| 极品色社| 国产福利夜| 人人手机欧洲亚洲国产人妻| 超碰人人妻|