精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

震驚!用了 std::optional 后,我再也沒(méi)有因?yàn)榭罩羔槺活I(lǐng)導(dǎo)罵過(guò)

開發(fā)
今天我們就來(lái)聊聊 C++17 引入的一個(gè)神器——std::optional,它能讓你優(yōu)雅地處理"可能存在,也可能不存在"的值,從此和空指針說(shuō)拜拜!

大家好,我是小康。

哎,說(shuō)起空指針,估計(jì)每個(gè)程序員都有一把辛酸淚。昨天還在跑得好好的程序,今天突然就給你來(lái)個(gè)Segmentation fault,然后你就開始了漫長(zhǎng)的debug之旅。是不是很熟悉這個(gè)場(chǎng)景?

今天我們就來(lái)聊聊 C++17 引入的一個(gè)神器——std::optional,它能讓你優(yōu)雅地處理"可能存在,也可能不存在"的值,從此和空指針說(shuō)拜拜!

一、為什么我們需要optional?

先來(lái)看個(gè)真實(shí)的場(chǎng)景。你寫了個(gè)函數(shù),用來(lái)查找數(shù)組中的最大值:

#include <iostream>
#include <vector>

int findMax(const std::vector<int>& nums) {
    if (nums.empty()) {
        // 糟糕!空數(shù)組怎么辦?
        return ???; // 返回什么好呢?
    }
    
    int maxVal = nums[0];
    for (int num : nums) {
        if (num > maxVal) {
            maxVal = num;
        }
    }
    return maxVal;
}

看到了吧?當(dāng)數(shù)組為空時(shí),我們陷入了兩難:

  • 返回0?但萬(wàn)一數(shù)組里都是負(fù)數(shù)呢?
  • 返回-1?但萬(wàn)一-1就是數(shù)組中的有效值呢?
  • 返回nullptr?那就要返回指針,但指針指向哪里呢?局部變量?靜態(tài)變量?還要擔(dān)心內(nèi)存管理...
  • 拋異常?有點(diǎn)小題大做了...

你可能會(huì)說(shuō):"返回指針不行嗎?" 我們來(lái)看看:

int* findMax(const std::vector<int>& nums) {
    if (nums.empty()) {
        return nullptr;
    }
    
    staticint maxVal; // 用靜態(tài)變量?危險(xiǎn)!
    maxVal = nums[0];
    for (int num : nums) {
        if (num > maxVal) {
            maxVal = num;
        }
    }
    return &maxVal;
}

// 使用時(shí)的問(wèn)題:
int* result1 = findMax({1, 2, 3});
int* result2 = findMax({4, 5, 6});
std::cout << *result1 << std::endl; // 輸出6而不是3!被覆蓋了

用指針的話,要么面臨生命周期問(wèn)題,要么要?jiǎng)討B(tài)分配內(nèi)存,麻煩得很!

這就是 optional 大顯身手的時(shí)候了!

二、optional閃亮登場(chǎng)

std::optional就像一個(gè)"盲盒",里面要么裝著你想要的值,要么啥也沒(méi)有。它完美解決了前面的所有問(wèn)題:

  • 不用糾結(jié)返回什么特殊值(0、-1都可能是有效值)
  • 不用擔(dān)心指針的生命周期和內(nèi)存管理
  • 語(yǔ)義超級(jí)清晰:有值就是有值,沒(méi)值就是沒(méi)值,絕不含糊

用起來(lái)特別優(yōu)雅:

#include <iostream>
#include <vector>
#include <optional>

std::optional<int> findMax(const std::vector<int>& nums) {
    if (nums.empty()) {
        return std::nullopt; // 優(yōu)雅地表示"沒(méi)有值"
    }
    
    int maxVal = nums[0];
    for (int num : nums) {
        if (num > maxVal) {
            maxVal = num;
        }
    }
    return maxVal; // 自動(dòng)包裝成optional
}

int main() {
    std::vector<int> nums1 = {3, 1, 4, 1, 5};
    std::vector<int> nums2 = {}; // 空數(shù)組
    
    auto result1 = findMax(nums1);
    auto result2 = findMax(nums2);
    
    if (result1.has_value()) {
        std::cout << "最大值是: " << result1.value() << std::endl;
    } else {
        std::cout << "數(shù)組為空,沒(méi)有最大值" << std::endl;
    }
    
    if (result2.has_value()) {
        std::cout << "最大值是: " << result2.value() << std::endl;
    } else {
        std::cout << "數(shù)組為空,沒(méi)有最大值" << std::endl;
    }
    
    return0;
}

運(yùn)行結(jié)果:

最大值是: 5
數(shù)組為空,沒(méi)有最大值

看到?jīng)]?代碼邏輯清晰,不會(huì)崩潰,還很好理解!

三、optional的各種玩法

1. 創(chuàng)建optional的幾種方式

#include <iostream>
#include <optional>
#include<vector>
#include <string>

int main() {
    // 方式1:直接賦值
    std::optional<int> opt1 = 42;
    
    // 方式2:使用make_optional
    auto opt2 = std::make_optional<int>(100);
    
    // 方式3:空的optional
    std::optional<std::string> opt3; // 默認(rèn)為空
    std::optional<std::string> opt4 = std::nullopt; // 顯式為空
    
    // 方式4:復(fù)雜類型
    std::optional<std::vector<int>> opt5 = std::vector<int>{1, 2, 3};
    
    std::cout << "opt1有值嗎? " << (opt1.has_value() ? "是" : "否") << std::endl;
    std::cout << "opt3有值嗎? " << (opt3.has_value() ? "是" : "否") << std::endl;
    
    return 0;
}

輸出:

opt1有值嗎? 是
opt3有值嗎? 否

2. 安全地取值

#include <iostream>
#include <optional>

std::optional<int> divide(int a, int b) {
    if (b == 0) {
        returnstd::nullopt; // 除零?不存在的!
    }
    return a / b;
}

int main() {
    auto result1 = divide(10, 2);
    auto result2 = divide(10, 0);
    
    // 方法1:使用has_value()檢查
    if (result1.has_value()) {
        std::cout << "10 / 2 = " << result1.value() << std::endl;
    }
    
    // 方法2:使用value_or()提供默認(rèn)值
    std::cout << "10 / 0 = " << result2.value_or(-1) << " (默認(rèn)值)" << std::endl;
    
    // 方法3:直接用*操作符(要確保有值)
    if (result1) { // 可以直接當(dāng)bool用!
        std::cout << "用*操作符: " << *result1 << std::endl;
    }
    
    return 0;
}

輸出:

10 / 2 = 5
10 / 0 = -1 (默認(rèn)值)
用*操作符: 5

3. 鏈?zhǔn)讲僮鳌@個(gè)真的很酷!

C++23還引入了 transform 和 and_then 方法,讓你可以像處理管道一樣處理optional:

#include <iostream>
#include <optional>
#include <string>

// 模擬一個(gè)可能失敗的字符串轉(zhuǎn)數(shù)字函數(shù)
std::optional<int> stringToInt(const std::string& s) {
    try {
        return std::stoi(s);
    } catch (...) {
        return std::nullopt;
    }
}

// 平方函數(shù)
std::optional<int> square(int x) {
    if (x > 1000) { // 防止溢出
        return std::nullopt;
    }
    return x * x;
}

int main() {
    std::string input1 = "5";
    std::string input2 = "abc";
    std::string input3 = "50";
    
    // 傳統(tǒng)寫法
    auto num1 = stringToInt(input1);
    if (num1.has_value()) {
        auto squared = square(*num1);
        if (squared.has_value()) {
            std::cout << "傳統(tǒng)寫法: " << *squared << std::endl;
        }
    }
    
    // 現(xiàn)代寫法(需要C++23,這里展示概念)
    // auto result = stringToInt(input1)
    //     .and_then([](int x) { return square(x); });
    
    // 我們用傳統(tǒng)方式模擬鏈?zhǔn)秸{(diào)用
    auto processString = [](conststd::string& s) -> std::optional<int> {
        auto num = stringToInt(s);
        if (!num.has_value()) return std::nullopt;
        return square(*num);
    };
    
    std::cout << "input1 \"5\" 的平方: " << processString(input1).value_or(-1) << std::endl;
    std::cout << "input2 \"abc\" 的平方: " << processString(input2).value_or(-1) << " (無(wú)效)" << std::endl;
    std::cout << "input3 \"50\" 的平方: " << processString(input3).value_or(-1) << std::endl;
    
    return 0;
}

輸出:

傳統(tǒng)寫法: 25
input1 "5" 的平方: 25
input2 "abc" 的平方: -1 (無(wú)效)
input3 "50" 的平方: 2500

四、實(shí)戰(zhàn)應(yīng)用:配置文件解析器

來(lái)個(gè)實(shí)際點(diǎn)的例子。假設(shè)你要寫個(gè)配置文件解析器,有些配置項(xiàng)可能存在,有些可能不存在:

#include <iostream>
#include <optional>
#include <unordered_map>
#include <string>

class ConfigParser {
private:
    std::unordered_map<std::string, std::string> config_;
    
public:
    ConfigParser() {
        // 模擬從文件讀取配置
        config_["host"] = "localhost";
        config_["port"] = "8080";
        // 注意:沒(méi)有"timeout" 和 database_host 配置
    }
    
    std::optional<std::string> getString(const std::string& key) {
        auto it = config_.find(key);
        if (it != config_.end()) {
            return it->second;
        }
        return std::nullopt;
    }
    
    std::optional<int> getInt(const std::string& key) {
        auto str = getString(key);
        if (!str.has_value()) {
            return std::nullopt;
        }
        
        try {
            return std::stoi(*str);
        } catch (...) {
            return std::nullopt;
        }
    }
};

int main() {
    ConfigParser config;
    
    // 獲取主機(jī)名
    auto host = config.getString("host");
    std::cout << "主機(jī): " << host.value_or("未配置") << std::endl;
    
    // 獲取端口號(hào)
    auto port = config.getInt("port");
    std::cout << "端口: " << port.value_or(80) << std::endl;
    
    // 獲取超時(shí)時(shí)間(不存在的配置)
    auto timeout = config.getInt("timeout");
    std::cout << "超時(shí): " << timeout.value_or(30) << "秒" << std::endl;
    
    // 實(shí)際使用中的判斷
    if (auto dbHost = config.getString("database_host")) {
        std::cout << "連接數(shù)據(jù)庫(kù): " << *dbHost << std::endl;
    } else {
        std::cout << "數(shù)據(jù)庫(kù)配置缺失,使用內(nèi)存存儲(chǔ)" << std::endl;
    }
    
    return 0;
}

輸出:

主機(jī): localhost
端口: 8080
超時(shí): 30秒
數(shù)據(jù)庫(kù)配置缺失,使用內(nèi)存存儲(chǔ)

五、optional VS 傳統(tǒng)方案

讓我們對(duì)比一下各種處理"可能不存在"值的方案:

#include <iostream>
#include <optional>
#include <vector>

// 傳統(tǒng)方案1:使用特殊值
int findFirstEven_Traditional(const std::vector<int>& nums) {
    for (int num : nums) {
        if (num % 2 == 0) {
            return num;
        }
    }
    return -1; // 特殊值表示"沒(méi)找到"
}

// 傳統(tǒng)方案2:使用指針
int* findFirstEven_Pointer(const std::vector<int>& nums) {
    staticint result; // 靜態(tài)變量,危險(xiǎn)!
    for (int num : nums) {
        if (num % 2 == 0) {
            result = num;
            return &result;
        }
    }
    return nullptr;
}

// 現(xiàn)代方案:使用optional
std::optional<int> findFirstEven_Optional(const std::vector<int>& nums) {
    for (int num : nums) {
        if (num % 2 == 0) {
            return num;
        }
    }
    return std::nullopt;
}

int main() {
    std::vector<int> nums1 = {1, 3, 4, 7, 8};
    std::vector<int> nums2 = {1, 3, 5, 7, 9};
    
    std::cout << "=== 測(cè)試有偶數(shù)的數(shù)組 ===" << std::endl;
    
    // 傳統(tǒng)方案1
    int result1 = findFirstEven_Traditional(nums1);
    if (result1 != -1) {
        std::cout << "傳統(tǒng)方案1: " << result1 << std::endl;
    }
    
    // 傳統(tǒng)方案2
    int* result2 = findFirstEven_Pointer(nums1);
    if (result2 != nullptr) {
        std::cout << "傳統(tǒng)方案2: " << *result2 << std::endl;
    }
    
    // 現(xiàn)代方案
    auto result3 = findFirstEven_Optional(nums1);
    if (result3.has_value()) {
        std::cout << "optional方案: " << *result3 << std::endl;
    }
    
    std::cout << "\n=== 測(cè)試全是奇數(shù)的數(shù)組 ===" << std::endl;
    
    std::cout << "傳統(tǒng)方案1: " << findFirstEven_Traditional(nums2) << " (可能和有效值混淆)" << std::endl;
    
    int* ptr_result = findFirstEven_Pointer(nums2);
    std::cout << "傳統(tǒng)方案2: " << (ptr_result ? "有值" : "無(wú)值") << std::endl;
    
    auto opt_result = findFirstEven_Optional(nums2);
    std::cout << "optional方案: " << (opt_result.has_value() ? "有值" : "無(wú)值") << std::endl;
    
    return 0;
}

輸出:

=== 測(cè)試有偶數(shù)的數(shù)組 ===
傳統(tǒng)方案1: 4
傳統(tǒng)方案2: 4
optional方案: 4

=== 測(cè)試全是奇數(shù)的數(shù)組 ===
傳統(tǒng)方案1: -1 (可能和有效值混淆)
傳統(tǒng)方案2: 無(wú)值
optional方案: 無(wú)值

看出差別了吧?optional方案最清晰,不會(huì)產(chǎn)生歧義!

六、性能怎么樣?

你可能會(huì)擔(dān)心:用optional會(huì)不會(huì)影響性能?答案是:幾乎不會(huì)!

std::optional的實(shí)現(xiàn)非常高效,它通常就是一個(gè)聯(lián)合體加上一個(gè)bool標(biāo)志位,開銷很小。而且相比傳統(tǒng)的指針檢查,它還能避免很多潛在的bug。

#include <optional>
#include <chrono>
#include <iostream>
#include <unordered_map>
#include <string>

class Config {
private:
    std::unordered_map<std::string, std::string> data;
public:
    Config() {
        // 模擬從文件加載100個(gè)配置項(xiàng)
        for (int i = 0; i < 100; ++i) {
            data["key" + std::to_string(i)] = "value" + std::to_string(i);
        }
    }
    
    // 傳統(tǒng)方式
    std::string* getTraditional(const std::string& key) {
        auto it = data.find(key);
        return (it != data.end()) ? &it->second : nullptr;
    }
    
    // optional方式
    std::optional<std::string> getOptional(const std::string& key) {
        auto it = data.find(key);
        return (it != data.end()) ? std::optional<std::string>(it->second) : std::nullopt;
    }
};

int main() {
    Config config;
    const int iterations = 100000;  // 模擬10萬(wàn)次配置查詢
    
    // 測(cè)試傳統(tǒng)方式
    auto start = std::chrono::high_resolution_clock::now();
    for (int i = 0; i < iterations; ++i) {
        auto result = config.getTraditional("key42");
        if (result) {
            volatile auto x = result->length();  // 模擬使用配置
        }
    }
    auto end = std::chrono::high_resolution_clock::now();
    auto traditional_time = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
    
    // 測(cè)試optional方式
    start = std::chrono::high_resolution_clock::now();
    for (int i = 0; i < iterations; ++i) {
        auto result = config.getOptional("key42");
        if (result) {
            volatile auto x = result->length();  // 模擬使用配置
        }
    }
    end = std::chrono::high_resolution_clock::now();
    auto optional_time = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
    
    std::cout << "配置查詢測(cè)試(10萬(wàn)次):" << std::endl;
    std::cout << "傳統(tǒng)方式耗時(shí):" << traditional_time.count() << " 微秒" << std::endl;
    std::cout << "optional方式耗時(shí):" << optional_time.count() << " 微秒" << std::endl;
    std::cout << "性能差異:" << (double)optional_time.count() / traditional_time.count() << "倍" << std::endl;
    
    return 0;
}

在我的機(jī)器上運(yùn)行,兩種方式的性能差異微乎其微,但optional的代碼更安全、更清晰。

配置查詢測(cè)試(10萬(wàn)次):
傳統(tǒng)方式耗時(shí):7060 微秒
optional方式耗時(shí):8581 微秒
性能差異:1.21544倍

七、總結(jié):optional的優(yōu)勢(shì)

用了這么多例子,我們來(lái)總結(jié)一下 optional 的好處:

  • 類型安全:編譯時(shí)就能發(fā)現(xiàn)潛在問(wèn)題
  • 語(yǔ)義清晰:一眼就能看出這個(gè)值可能不存在
  • 性能優(yōu)秀:幾乎零開銷的抽象
  • 易于使用:API設(shè)計(jì)得很人性化
  • 現(xiàn)代化:符合現(xiàn)代C++的設(shè)計(jì)理念

八、小貼士

最后給大家?guī)讉€(gè)使用 optional 的小技巧:

  • 區(qū)分錯(cuò)誤和空值:如果"沒(méi)有值"表示錯(cuò)誤情況,用異常;如果是正常情況,用optional
  • 善用value_or方法:它能讓你的代碼更簡(jiǎn)潔
  • 結(jié)合auto:讓編譯器推導(dǎo)類型,代碼更干凈
  • 鏈?zhǔn)秸{(diào)用:C++23的 transform 和 and_then 很強(qiáng)大,值得學(xué)習(xí)

好了,關(guān)于 std::optional 就講到這里。從此以后,遇到"可能存在,可能不存在"的值,你就知道該用什么工具了。告別空指針崩潰,擁抱優(yōu)雅代碼!

記住,編程不只是讓程序跑起來(lái),更要讓程序跑得優(yōu)雅、安全、可維護(hù)。std::optional就是這樣一個(gè)讓你的C++代碼更優(yōu)雅的利器。

快去試試吧,你會(huì)愛(ài)上它的!

責(zé)任編輯:趙寧寧 來(lái)源: 跟著小康學(xué)編程
相關(guān)推薦

2015-09-09 10:50:32

模擬駕駛

2019-02-27 15:15:41

汽車保險(xiǎn)自動(dòng)駕駛數(shù)據(jù)分析

2024-08-12 08:28:35

2022-01-23 08:04:29

Windows 10微軟

2020-12-18 08:28:13

Redis數(shù)據(jù)數(shù)據(jù)庫(kù)

2023-10-08 11:09:22

Optional空指針

2024-12-06 10:12:20

2020-03-12 07:55:50

訪問(wèn)量飆升DDoS

2023-08-04 08:52:52

Optional消滅空指針

2023-03-27 07:39:07

內(nèi)存溢出優(yōu)化

2023-05-14 22:25:33

內(nèi)存CPU

2024-02-01 12:09:17

Optional容器null

2024-02-28 09:03:20

Optional空指針Java

2021-10-25 23:12:06

iOS應(yīng)用系統(tǒng)

2024-10-15 15:58:11

2021-03-26 15:18:11

代碼工具Mockoon

2020-08-26 07:37:25

Nacos微服務(wù)SpringBoot

2013-05-10 09:40:16

移動(dòng)Nokia移動(dòng)市場(chǎng)

2021-02-07 22:20:30

5G網(wǎng)絡(luò)工具

2020-07-01 09:07:52

SQL索引語(yǔ)句
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日本在线视频www| 亚洲一区二区三区久久 | 亚洲日本一区二区三区在线不卡| 中文字幕一区二区人妻痴汉电车| 999成人网| 亚洲第一视频网站| 日本新janpanese乱熟| 毛片激情在线观看| av午夜一区麻豆| 欧美精品激情视频| 亚洲永久精品ww.7491进入| 欧美电影在线观看网站| 五月婷婷综合激情| 一区二区三区四区五区视频| 丰满少妇在线观看bd| 青椒成人免费视频| 97视频在线观看免费| 天美传媒免费在线观看| 国产一区二区三区亚洲| 欧美日韩精品一区二区天天拍小说| www婷婷av久久久影片| 久久久久久久久亚洲精品| 狠狠色综合播放一区二区| 91av视频在线免费观看| 成人免费视频网站入口::| 亚洲影院天堂中文av色| 亚洲大胆人体在线| 婷婷激情小说网| 国产成人精品一区二三区在线观看| 一区二区三区四区中文字幕| 樱花www成人免费视频| 五月天激情婷婷| 国产精品12区| 91精品久久久久久久久久久久久久 | 亚洲精品久久一区二区三区777| 欧美在线va视频| 亚洲sss视频在线视频| 久久久国产精华液999999| 日韩在线免费看| 国产成人免费视频| 91久久国产精品91久久性色| 国产一级片av| 午夜亚洲福利在线老司机| 欧美另类极品videosbest最新版本| 五月天精品在线| 欧美色就是色| 一区二区日韩精品| 丰满少妇高潮一区二区| 亚洲动漫在线观看| 亚洲欧美日韩高清| 国产中年熟女高潮大集合| 欧美日韩一区二区三区四区不卡| 欧美二区在线观看| 97人人爽人人| 在线免费观看亚洲| 欧美美女激情18p| 99sesese| 粉嫩av国产一区二区三区| 欧美日韩的一区二区| jizz欧美性11| 国产精品亚洲欧美日韩一区在线 | 亚洲精品一区二区三区区别| 国产成人免费网站| 好看的日韩精品| 日韩电影在线观看完整版| 91蜜桃视频在线| 欧美深深色噜噜狠狠yyy| 激情小视频在线| 国产精品三级av| 国产奶头好大揉着好爽视频| av免费在线网站| 亚洲成人中文在线| 欧美视频在线播放一区| 中日韩脚交footjobhd| 黄网在线免费看| 久久久精品国产99久久精品芒果 | 日本三级韩国三级久久| 日韩在线 中文字幕| 日本午夜精品视频在线观看| 国产精品久久色| 国产精品美女一区| 高清成人在线观看| 欧美精品一区二区视频| yes4444视频在线观看| 自拍偷拍亚洲激情| 日本一区午夜艳熟免费| 亚洲一区站长工具| 欧美三级乱人伦电影| 国产老头和老头xxxx×| 亚洲瘦老头同性70tv| 中文字幕一区二区三区电影| 欧美黑人猛猛猛| 国产亚洲激情| 91视频国产一区| 亚洲av成人无码久久精品老人 | 国产精品毛片视频| 亚洲免费高清视频| 日本在线一级片| 午夜宅男久久久| 91社区国产高清| 日韩二区三区| 一区二区在线观看视频在线观看| 日本精品一区二区三区四区| 深夜日韩欧美| 亚洲精品中文字幕av| 日韩国产第一页| 性8sex亚洲区入口| 97久久精品午夜一区二区| 你懂的在线观看| 亚洲一区二区四区蜜桃| 成年网站在线播放| 人人精品亚洲| 久99久在线视频| 国产精品成人无码| 69久久夜色| 国产日韩欧美精品一区| 成年丰满熟妇午夜免费视频| 欧美××××黑人××性爽| 精品日韩欧美在线| 国产中文字幕久久| 久久精品亚洲一区二区| 成人在线视频电影| 国产一二区在线观看| 91精品福利在线| 在线天堂www在线国语对白| 66久久国产| 国产精品久久久久久久久借妻| 成人高潮片免费视频| 国产精品久久久久久久久图文区| 成人免费aaa| 国产伦精品一区二区三区在线播放| 日韩在线免费高清视频| www.日韩一区| 久久一区二区三区国产精品| 97中文字幕在线| 视频精品二区| 久久久成人精品视频| 亚洲无码精品一区二区三区| 99国产精品久久久| 色综合久久久久无码专区| 无码国模国产在线观看| 欧美成人精品激情在线观看 | 欧美极品视频一区二区三区| 123区在线| 亚洲电影在线观看| 国产在线视频第一页| 国产成人免费视| 国产精品自拍合集| 91综合精品国产丝袜长腿久久| 久久艹在线视频| av中文字幕在线免费观看| 亚洲少妇最新在线视频| 午夜一区二区视频| 在线免费观看日本欧美爱情大片| 91精品久久久久久久久久久久久久| melody高清在线观看| 欧美日韩在线综合| 黄色av片三级三级三级免费看| 日本美女一区二区三区| 亚洲精品tv久久久久久久久| 开心久久婷婷综合中文字幕| 日韩在线免费视频观看| 日本不卡高清视频一区| 在线日本中文字幕| 欧美丰满嫩嫩电影| 中文字幕影音先锋| 高清在线观看日韩| 欧美国产激情视频| 奇米狠狠一区二区三区| 国产精品三级久久久久久电影| 91看片在线观看| 欧美一级生活片| 日本少妇bbwbbw精品| 99久久国产综合精品女不卡| 亚洲爆乳无码专区| 欧美电影免费观看高清| 成人av免费看| 性国裸体高清亚洲| 中文字幕精品一区久久久久| 国产精品色综合| 亚洲福利视频一区二区| 美女100%无挡| 韩国精品一区二区| 成人一对一视频| 成人精品久久| 99九九视频| 欧美xxx网站| 久久视频在线播放| 亚洲三区在线播放| 欧美美女激情18p| 欧美bbbbbbbbbbbb精品| 国产精品丝袜久久久久久app| 色男人天堂av| 免费一级欧美片在线播放| 色呦呦网站入口| 欧美一级色片| 91亚洲精品在线| 国产精品迅雷| 欧美大片在线看| 国产1区2区3区在线| 日韩免费观看高清完整版| 成人一级免费视频| 亚洲一二三专区| 国产成人精品视频免费| a在线播放不卡| 国产永久免费网站| 六月天综合网| 成年人深夜视频| 日本欧美视频| 国产欧美一区二区三区另类精品| 国产精品videossex撒尿| 久久久久久久一区二区三区| 成年网站在线| 亚洲免费电影一区| 日本波多野结衣在线| 欧美日韩精品欧美日韩精品一 | 国产福利一区二区三区在线观看| 视频在线日韩| 97超碰色婷婷| 欧美hdxxx| 欧美大成色www永久网站婷| 国产日产精品久久久久久婷婷| 精品国产精品网麻豆系列| 一区二区www| 欧美自拍偷拍午夜视频| 亚洲免费在线观看av| 一区二区欧美在线观看| 日本爱爱小视频| 国产精品色一区二区三区| 日韩一级视频在线观看| 本田岬高潮一区二区三区| 麻豆网站免费观看| 韩国成人福利片在线播放| 最近中文字幕一区二区| 久久激情久久| 丁香啪啪综合成人亚洲| 99亚洲伊人久久精品影院红桃| 久久亚洲国产成人精品无码区| 国产精品久久观看| 亚洲AV无码成人精品一区| 成人精品久久| 亚洲图片小说在线| 日韩理论电影| 亚洲精品成人a8198a| 第四色成人网| 亚洲日本一区二区三区在线不卡| 热久久天天拍国产| 亚洲永久激情精品| 99久久久久国产精品| 亚洲在线视频一区二区| 欧美岛国激情| 精品国产无码在线| 51精产品一区一区三区| 第九区2中文字幕| 欧美91福利在线观看| 无码人妻精品一区二区蜜桃百度| 欧美不卡视频| www.射射射| 国产免费成人| 男女午夜激情视频| 日韩精品国产精品| 亚洲一区二区三区观看| 国产乱人伦偷精品视频不卡 | 亚洲综合色婷婷在线观看| 999在线观看免费大全电视剧| eeuss国产一区二区三区四区| 国产一区再线| 精品国产乱码久久久久久蜜坠欲下 | 欧美最近摘花xxxx摘花| 久久久一本精品| 91精品久久久久久久久久久| 日韩精品成人在线观看| 国产精品久久久久久久久久久久午夜片 | 一区二区三区成人精品| 国产精品无码av无码| 精品综合久久久久久8888| 国产伦精品一区二区三区妓女下载 | 欧美性xxxxx| 91极品身材尤物theporn| 欧美成人女星排名| 日本一区二区三区在线观看视频| 在线丨暗呦小u女国产精品| fc2ppv国产精品久久| 久久久综合av| 日本h片久久| a级国产乱理论片在线观看99| 日韩在线影视| 一区二区三区一级片| 9久re热视频在线精品| 亚洲一区二区三区四区五区xx| 狠狠色丁香久久婷婷综合丁香| 国产精品久久久久久久无码| 国产精品午夜春色av| 九九热精彩视频| 欧美手机在线视频| 亚洲黄色小说网址| 中文字幕日韩欧美在线视频| av电影院在线看| 国产免费一区视频观看免费 | 亚洲欧美日韩综合| 综合久久2019| 国产精品jvid在线观看蜜臀| 日韩视频一区二区三区四区| 欧洲一区二区在线| 欧美精品aa| 婷婷激情四射五月天| 99久久精品国产网站| 免费看特级毛片| 欧美在线制服丝袜| 熟妇人妻一区二区三区四区 | 懂色av一区二区三区蜜臀 | 日韩a在线观看| 欧美黄色免费网站| 精品三级在线| 日韩激情视频| 亚洲一区二区网站| 熟妇高潮一区二区| 亚洲精品欧美在线| 亚洲综合免费视频| 亚洲色图欧美制服丝袜另类第一页| 黄色在线看片| 3d动漫精品啪啪一区二区三区免费| 日本电影一区二区| 日韩视频免费在线播放| 99re亚洲国产精品| 国产精品成人网站| 精品少妇一区二区| 午夜在线激情影院| 91最新国产视频| 欧美大片aaaa| 亚洲一区日韩精品| 国产精品狼人久久影院观看方式| 免费黄色av片| 亚洲欧美中文另类| 樱花草涩涩www在线播放| 精品亚洲一区二区三区四区五区高| 国精品一区二区| 日韩高清一二三区| 亚洲一区二区在线观看视频| 99久久久国产精品无码网爆| www.日韩视频| 91成人精品观看| 99精品一级欧美片免费播放| 老司机午夜精品99久久| 国产传媒视频在线| 在线观看免费亚洲| 成人77777| 国产精品免费福利| 国产免费av一区二区三区| 国产免费视频传媒| 精品无人区卡一卡二卡三乱码免费卡| 欧美激情 一区| 色猫猫国产区一区二在线视频| 九一国产在线| 欧美一区二区三区……| 亚洲另类av| 农村妇女精品一二区| 中文字幕国产精品一区二区| 波多野结衣视频网址| 亚洲第一网站免费视频| 高清全集视频免费在线| 国产精品第8页| 日韩欧美在线中字| 一级黄色高清视频| 偷窥国产亚洲免费视频| 少妇喷水在线观看| 国产成人av在线| 欧美日韩高清| 日韩avxxx| 中文字幕av一区 二区| 91久久国语露脸精品国产高跟| 超碰91人人草人人干| 综合欧美亚洲| 老熟妇仑乱视频一区二区| 国产色综合久久| 国产女主播福利| 国色天香2019中文字幕在线观看| 欧美男男gaytwinkfreevideos| 韩国日本美国免费毛片| 亚洲手机成人高清视频| 亚洲精品18p| 国产99久久精品一区二区永久免费| 国产一区二区观看| jizz18女人| 天天射综合影视| 无码精品黑人一区二区三区| 国产成人亚洲综合91精品| 日韩成人激情| 手机在线成人av| 欧美吻胸吃奶大尺度电影| 七七久久电影网| 蜜桃传媒视频第一区入口在线看| 国内精品视频一区二区三区八戒| 九九热精彩视频| 一本大道亚洲视频| 欧美久久一区二区三区| 人妻夜夜添夜夜无码av| 国产亚洲精品超碰| 国产日韩欧美中文字幕| 全亚洲最色的网站在线观看|