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

聊聊我常用的10個C++新特性

開發 后端
這篇文章我會總結一些常用的新特性,這些新特性可以說是必須掌握的!我也不太清楚其他人常用的新特性有啥,這里僅分享下我和身邊朋友們常用的新特性!

[[405800]]

之前文章介紹的是C++11之后所有的新特性,這篇文章我會總結一些常用的新特性,這些新特性可以說是必須掌握的!我也不太清楚其他人常用的新特性有啥,這里僅分享下我和身邊朋友們常用的新特性!

下面是正文:

auto類型推導

auto可以讓編譯器在編譯器就推導出變量的類型,看代碼:

  1. auto a = 10; // 10是int型,可以自動推導出a是int 
  2.  
  3. int i = 10; 
  4. auto b = i; // b是int型 
  5.  
  6. auto d = 2.0; // d是double型 
  7. auto f = []() { // f是啥類型?直接用auto就行 
  8.     return std::string("d"); 

利用auto可以通過=右邊的類型推導出變量的類型。

什么時候使用auto呢?簡單類型其實沒必要使用auto,然而某些復雜類型就有必要使用auto,比如lambda表達式的類型,async函數的類型等,例如:

  1. auto func = [&] {     
  2.     cout << "xxx"
  3. }; // 對于func你難道不使用auto嗎,反正我是不關心lambda表達式究竟是什么類型。 
  4. auto asyncfunc = std::async(std::launch::async, func); 

智能指針

C++11新特性中主要有兩種智能指針std::shared_ptr和std::unique_ptr。

那什么時候使用std::shared_ptr,什么時候使用std::unique_ptr呢?

  • 當所有權不明晰的情況,有可能多個對象共同管理同一塊內存時,要使用std::shared_ptr;
  • 而std::unique_ptr強調的是獨占,同一時刻只能有一個對象占用這塊內存,不支持多個對象共同管理同一塊內存。

兩類智能指針使用方式類似,拿std::unique_ptr舉例:

  1. using namespace std; 
  2.  
  3. struct A { 
  4.    ~A() { 
  5.        cout << "A delete" << endl; 
  6.    } 
  7.    void Print() { 
  8.        cout << "A" << endl; 
  9.    } 
  10. }; 
  11.  
  12.  
  13. int main() { 
  14.    auto ptr = std::unique_ptr<A>(new A); 
  15.    auto tptr = std::make_unique<A>(); // error, c++11還不行,需要c++14 
  16.    std::unique_ptr<A> tem = ptr; // error, unique_ptr不允許移動,編譯失敗 
  17.    ptr->Print(); 
  18.    return 0; 

std::lock相關

C++11提供了兩種鎖封裝,通過RAII方式可動態的釋放鎖資源,防止編碼失誤導致始終持有鎖。

這兩種封裝是std::lock_guard和std::unique_lock,使用方式類似,看下面的代碼:

  1. #include <iostream> 
  2. #include <mutex> 
  3. #include <thread> 
  4. #include <chrono> 
  5.  
  6. using namespace std; 
  7. std::mutex mutex_; 
  8.  
  9. int main() { 
  10.    auto func1 = [](int k) { 
  11.        // std::lock_guard<std::mutex> lock(mutex_); 
  12.        std::unique_lock<std::mutex> lock(mutex_); 
  13.        for (int i = 0; i < k; ++i) { 
  14.            cout << i << " "
  15.       } 
  16.        cout << endl; 
  17.   }; 
  18.    std::thread threads[5]; 
  19.    for (int i = 0; i < 5; ++i) { 
  20.        threads[i] = std::thread(func1, 200); 
  21.   } 
  22.    for (auto& th : threads) { 
  23.        th.join(); 
  24.   } 
  25.    return 0; 

普通情況下建議使用std::lock_guard,因為std::lock_guard更加輕量級,但如果用在條件變量的wait中環境中,必須使用std::unique_lock。

條件變量

條件變量是C++11引入的一種同步機制,它可以阻塞一個線程或多個線程,直到有線程通知或者超時才會喚醒正在阻塞的線程,條件變量需要和鎖配合使用,這里的鎖就是上面介紹的std::unique_lock。

這里使用條件變量實現一個CountDownLatch:

  1. class CountDownLatch { 
  2.    public
  3.     explicit CountDownLatch(uint32_t count) : count_(count); 
  4.  
  5.     void CountDown() { 
  6.         std::unique_lock<std::mutex> lock(mutex_); 
  7.         --count_; 
  8.         if (count_ == 0) { 
  9.             cv_.notify_all(); 
  10.         } 
  11.     } 
  12.  
  13.     void Await(uint32_t time_ms = 0) { 
  14.         std::unique_lock<std::mutex> lock(mutex_); 
  15.         while (count_ > 0) { 
  16.             if (time_ms > 0) { 
  17.                 cv_.wait_for(lock, std::chrono::milliseconds(time_ms)); 
  18.             } else { 
  19.                 cv_.wait(lock); 
  20.             } 
  21.         } 
  22.     } 
  23.  
  24.     uint32_t GetCount() const { 
  25.         std::unique_lock<std::mutex> lock(mutex_); 
  26.       return count_; 
  27.     } 
  28.  
  29.    private: 
  30.     std::condition_variable cv_; 
  31.     mutable std::mutex mutex_; 
  32.     uint32_t count_ = 0; 
  33. }; 

條件變量還有幾個坑,可以看這篇文章:《使用條件變量的坑你知道嗎》

原子操作

C++11提供了原子類型std::atomic,用于原子操作,使用這種方式既可以保證線程安全,也不需要使用鎖來進行臨界區保護,對一些普通變量來說尤其方便,看代碼:

  1. std::atomic<int> atomicInt; 
  2. atomicInt++; 
  3. atomicInt--; 
  4. atomicInt.store(2); 
  5. int value = atomicInt.load(); 

多線程

什么是多線程這里就不過多介紹,新特性關于多線程最主要的就是std::thread的使用,它的使用也很簡單,看代碼:

  1. #include <iostream> 
  2. #include <thread> 
  3.  
  4. using namespace std; 
  5.  
  6. int main() { 
  7.    auto func = []() { 
  8.        for (int i = 0; i < 10; ++i) { 
  9.            cout << i << " "
  10.       } 
  11.        cout << endl; 
  12.   }; 
  13.    std::thread t(func); 
  14.    if (t.joinable()) { 
  15.        t.detach(); 
  16.   } 
  17.    auto func1 = [](int k) { 
  18.        for (int i = 0; i < k; ++i) { 
  19.            cout << i << " "
  20.       } 
  21.        cout << endl; 
  22.   }; 
  23.    std::thread tt(func1, 20); 
  24.    if (tt.joinable()) { // 檢查線程可否被join 
  25.        tt.join(); 
  26.   } 
  27.    return 0; 

這里記住,std::thread在其對象生命周期結束時必須要調用join()或者detach(),否則程序會terminate(),這個問題在C++20中的std::jthread得到解決,但是C++20現在多數編譯器還沒有完全支持所有特性,先暫時了解下即可,項目中沒必要著急使用。

左值右值移動語義相關

大家可能都聽說過左值右值,但可能會有部分讀者還沒有搞清楚這些概念。這里解惑下:

關于左值和右值,有兩種方式理解:

概念1:

左值:可以放到等號左邊的東西叫左值。

右值:不可以放到等號左邊的東西就叫右值。

概念2:

左值:可以取地址并且有名字的東西就是左值。

右值:不能取地址的沒有名字的東西就是右值。

舉例來說:

  1. int a = b + c 
  2. int d = 4; // d是左值,4作為普通字面量,是右值 

a是左值,有變量名,可以取地址,也可以放到等號左邊, 表達式b+c的返回值是右值,沒有名字且不能取地址,&(b+c)不能通過編譯,而且也不能放到等號左邊。

左值一般有:

  • 函數名和變量名
  • 返回左值引用的函數調用
  • 前置自增自減表達式++i、--i
  • 由賦值表達式或賦值運算符連接的表達式(a=b, a += b等)
  • 解引用表達式*p
  • 字符串字面值"abcd"

介紹右值前需要先介紹兩個概念:純右值和將亡值。

運算表達式產生的臨時變量、不和對象關聯的原始字面量、非引用返回的臨時變量、lambda表達式等都是純右值。例如:

  • 除字符串字面值外的字面值
  • 返回非引用類型的函數調用
  • 后置自增自減表達式i++、i--
  • 算術表達式(a+b, a*b, a&&b, a==b等)
  • 取地址表達式等(&a)

而將亡值是指C++11新增的和右值引用相關的表達式,通常指將要被移動的對象、T&&函數的返回值、std::move函數的返回值、轉換為T&&類型轉換函數的返回值,將亡值可以理解為即將要銷毀的值,通過“盜取”其它變量內存空間方式獲取的值,在確保其它變量不再被使用或者即將被銷毀時,可以避免內存空間的釋放和分配,延長變量值的生命周期,常用來完成移動構造或者移動賦值的特殊任務。例如:

  1. class A { 
  2.     xxx; 
  3. }; 
  4. A a; 
  5. auto c = std::move(a); // c是將亡值 
  6. auto d = static_cast<A&&>(a); // d是將亡值 

這塊的概念太多了,涉及很多知識點,這里不太展開介紹了,具體可以看這篇文章:《左值引用、右值引用、移動語義、完美轉發,你知道的不知道的都在這里》

std::function和lambda表達式

這兩個可以說是我最常用的特性,使用它們會讓函數的調用相當方便。使用std::function可以完全替代以前那種繁瑣的函數指針形式。

還可以結合std::bind一起使用,直接看一段示例代碼:

  1. std::function<void(int)> f; // 這里表示function的對象f的參數是int,返回值是void 
  2. #include <functional> 
  3. #include <iostream> 
  4.  
  5. struct Foo { 
  6.    Foo(int num) : num_(num) {} 
  7.    void print_add(int i) const { std::cout << num_ + i << '\n'; } 
  8.    int num_; 
  9. }; 
  10.  
  11. void print_num(int i) { std::cout << i << '\n'; } 
  12.  
  13. struct PrintNum { 
  14.    void operator()(int i) const { std::cout << i << '\n'; } 
  15. }; 
  16.  
  17. int main() { 
  18.    // 存儲自由函數 
  19.    std::function<void(int)> f_display = print_num; 
  20.    f_display(-9); 
  21.  
  22.    // 存儲 lambda 
  23.    std::function<void()> f_display_42 = []() { print_num(42); }; 
  24.    f_display_42(); 
  25.  
  26.    // 存儲到 std::bind 調用的結果 
  27.    std::function<void()> f_display_31337 = std::bind(print_num, 31337); 
  28.    f_display_31337(); 
  29.  
  30.    // 存儲到成員函數的調用 
  31.    std::function<void(const Foo&, int)> f_add_display = &Foo::print_add; 
  32.    const Foo foo(314159); 
  33.    f_add_display(foo, 1); 
  34.    f_add_display(314159, 1); 
  35.  
  36.    // 存儲到數據成員訪問器的調用 
  37.    std::function<int(Foo const&)> f_num = &Foo::num_; 
  38.    std::cout << "num_: " << f_num(foo) << '\n'
  39.  
  40.    // 存儲到成員函數及對象的調用 
  41.    using std::placeholders::_1; 
  42.    std::function<void(int)> f_add_display2 = std::bind(&Foo::print_add, foo, _1); 
  43.    f_add_display2(2); 
  44.  
  45.    // 存儲到成員函數和對象指針的調用 
  46.    std::function<void(int)> f_add_display3 = std::bind(&Foo::print_add, &foo, _1); 
  47.    f_add_display3(3); 
  48.  
  49.    // 存儲到函數對象的調用 
  50.    std::function<void(int)> f_display_obj = PrintNum(); 
  51.    f_display_obj(18); 

從上面可以看到std::function的使用方法,當給std::function填入合適的參數表和返回值后,它就變成了可以容納所有這一類調用方式的函數封裝器。std::function還可以用作回調函數,或者在C++里如果需要使用回調那就一定要使用std::function,特別方便,這方面的使用方式大家可以讀下我之前的文章《搞定c++11新特性std::function和lambda表達式》

lambda表達式可以說是C++11引入的最重要的特性之一,它定義了一個匿名函數,可以捕獲一定范圍的變量在函數內部使用,一般有如下語法形式:

  1. auto func = [capture] (params) opt -> ret { func_body; }; 

其中func是可以當作lambda表達式的名字,作為一個函數使用,capture是捕獲列表,params是參數表,opt是函數選項(mutable之類), ret是返回值類型,func_body是函數體。

看下面這段使用lambda表達式的示例吧:

  1. auto func1 = [](int a) -> int { return a + 1; }; auto func2 = [](int a) { return a + 2; }; cout << func1(1) << " " << func2(2) << endl; 

std::function和std::bind使得我們平時編程過程中封裝函數更加的方便,而lambda表達式將這種方便發揮到了極致,可以在需要的時間就地定義匿名函數,不再需要定義類或者函數等,在自定義STL規則時候也非常方便,讓代碼更簡潔,更靈活,提高開發效率。

std::file_system

C++17正式將file_system納入標準中,提供了關于文件的大多數功能,基本上應有盡有,這里簡單舉幾個例子:

  1. namespace fs = std::filesystem; 
  2. fs::create_directory(dir_path); 
  3. fs::copy_file(src, dst, fs::copy_options::skip_existing); 
  4. fs::exists(filename); 
  5. fs::current_path(err_code); 

file_system之前,想拷貝個文件、獲取文件信息等都需要使用好多C語言API搭配使用才能完成需求,而有了file_system,一切都變得相當簡單。file_system是C++17才引入的新功能,但其實在C++14中就可以使用了,只是file_system在std::experimental空間下。

std::chrono

chrono很強大,也是我常用的功能,平時的打印函數耗時,休眠某段時間等,我都是使用chrono。

在C++11中引入了duration、time_point和clocks,在C++20中還進一步支持了日期和時區。這里簡要介紹下C++11中的這幾個新特性。

duration

std::chrono::duration表示一段時間,常見的單位有s、ms等,示例代碼:

  1. // 拿休眠一段時間舉例,這里表示休眠100ms 
  2. std::this_thread::sleep_for(std::chrono::milliseconds(100)); 

sleep_for里面其實就是std::chrono::duration,表示一段時間,實際是這樣:

  1. typedef duration<int64_t, milli> milliseconds; 
  2. typedef duration<int64_t> seconds; 

duration具體模板如下:

  1. template <class Rep, class Period = ratio<1> > class duration; 

Rep表示一種數值類型,用來表示Period的數量,比如int、float、double,Period是ratio類型,用來表示【用秒表示的時間單位】比如second,常用的duration已經定義好了,在std::chrono::duration下:

  • ratio<3600, 1>:hours
  • ratio<60, 1>:minutes
  • ratio<1, 1>:seconds
  • ratio<1, 1000>:microseconds
  • ratio<1, 1000000>:microseconds
  • ratio<1, 1000000000>:nanosecons

ratio的具體模板如下:

  1. template <intmax_t N, intmax_t D = 1> class ratio; 

N代表分子,D代表分母,所以ratio表示一個分數,我們可以自定義Period,比如ratio<2, 1>表示單位時間是2秒。

time_point

表示一個具體時間點,如2020年5月10日10點10分10秒,拿獲取當前時間舉例:

  1. std::chrono::time_point<std::chrono::high_resolution_clock> Now() { 
  2.    return std::chrono::high_resolution_clock::now(); 
  3. // std::chrono::high_resolution_clock為高精度時鐘,下面會提到 

clocks

時鐘,chrono里面提供了三種時鐘:

  • steady_clock
  • system_clock
  • high_resolution_clock

steady_clock

穩定的時間間隔,表示相對時間,相對于系統開機啟動的時間,無論系統時間如何被更改,后一次調用now()肯定比前一次調用now()的數值大,可用于計時。

system_clock

表示當前的系統時鐘,可以用于獲取當前時間:

  1. int main() { 
  2.    using std::chrono::system_clock; 
  3.    system_clock::time_point today = system_clock::now(); 
  4.    std::time_t tt = system_clock::to_time_t(today); 
  5.    std::cout << "today is: " << ctime(&tt); 
  6.    return 0; 
  7. // today is: Sun May 10 09:48:36 2020 

high_resolution_clock

 

high_resolution_clock表示系統可用的最高精度的時鐘,實際上就是system_clock或者steady_clock其中一種的定義,官方沒有說明具體是哪個,不同系統可能不一樣,我之前看gcc chrono源碼中high_resolution_clock是steady_clock的typedef。

 

責任編輯:武曉燕 來源: 程序喵大人
相關推薦

2013-12-30 10:42:42

C++特性

2018-05-18 15:05:25

JavaJava 10新特性

2024-02-04 15:58:53

C++ 17編程代碼

2013-07-29 11:11:33

C++C++11

2021-03-06 08:10:16

Redis6 Java架構分布式框架

2010-01-14 10:56:43

Visual C++

2024-07-10 18:51:52

2012-06-13 10:26:21

iOS 6

2020-07-27 08:05:56

C++語言后端

2010-01-26 17:44:32

Visual C++開

2019-03-05 15:03:09

Android Q安卓系統功能

2009-08-19 09:38:34

C++編程

2009-08-18 17:03:49

C#3.5新特性

2021-08-19 08:31:46

云計算

2019-10-29 05:47:15

CC++Python

2025-01-13 12:30:00

C++開發編譯

2015-08-27 16:15:26

Windwos 10特性

2025-09-25 08:23:31

2010-01-25 18:19:17

C++特性

2009-08-26 17:10:09

C# 3.5新特性
點贊
收藏

51CTO技術棧公眾號

欧美精品videosex牲欧美| 福利在线导航136| 欧美啪啪网站| 一区二区91| 欧美日韩国产小视频在线观看| 国产精品免费观看高清| 成年人网站在线观看视频| 污视频在线免费观看| 婷婷综合激情| 日本高清不卡在线观看| 极品尤物一区二区三区| 久久视频免费看| 日日夜夜精品| 欧美高清在线视频| 日韩av电影手机在线观看| 久久久久亚洲无码| 天堂亚洲精品| 国产一区二区三区在线观看免费视频| 国产午夜精品一区二区三区| 国产午夜大地久久| 亚洲乱码国产乱码精品精软件| 国产精品久久观看| 亚洲第一福利网站| 日韩伦理在线免费观看| 亚洲第一第二区| 日本麻豆一区二区三区视频| 国产亚洲美女久久| 免费看91视频| 岛国av免费在线观看| 成人性色生活片| 韩剧1988免费观看全集| 久久久午夜精品福利内容| 超碰在线公开| 亚洲欧美综合另类在线卡通| 91人成网站www| 黄色一级免费视频| 亚洲一区二区三区免费| 亚洲国产综合在线| 久久精品国产美女| 成人一级免费视频| 欧美激情国产在线| 91精品国产综合久久久蜜臀图片| 日本精品免费视频| 成人午夜视频一区二区播放| 制服诱惑一区二区| 色综合视频网站| 加勒比精品视频| 欧洲一级精品| 国产精品蜜臀av| 96pao国产成视频永久免费| 久久精品一级片| 一区二区三区在线电影| 亚洲成人在线视频播放| 国产一级片中文字幕| 成人女同在线观看| 一区二区三区91| 日本不卡二区高清三区| 一二三四区在线| 欧美午夜电影在线观看 | 国产精品免费av| 亚洲精品国产系列| 99精品久久久久久中文字幕| 亚洲东热激情| 中文字幕9999| 四虎永久免费观看| 精品国产欧美日韩一区二区三区| 亚洲理论在线观看| 欧美精品人人做人人爱视频| ,一级淫片a看免费| 欧美日韩ab| 欧美极品美女电影一区| 国产无精乱码一区二区三区| 久久激情电影| 精品奇米国产一区二区三区| 日韩 欧美 高清| 视频在线这里都是精品| 亚洲综合在线视频| 久久国产亚洲精品无码| 久久综合之合合综合久久| 97超碰欧美中文字幕| 91久久精品久久国产性色也91| 国产又粗又猛又爽又黄的视频一| 美日韩精品视频| 欧美国产日韩精品| 日韩激情在线播放| 亚洲精品一二三区区别| 亚洲一二三在线| 美女网站视频色| 日韩成人一级| 欧美一区二区高清| 无码aⅴ精品一区二区三区浪潮| 福利在线视频网站| 亚洲国产成人在线| 天天干天天色天天爽| 黑人极品ⅴideos精品欧美棵| 一本久久精品一区二区| 成年人视频大全| 黄色免费在线看| 亚洲h在线观看| 国产精品视频二| 国产精品剧情一区二区在线观看| 亚洲国产精品久久一线不卡| 8x8ⅹ国产精品一区二区二区| 成年人在线视频| 91麻豆成人久久精品二区三区| 国产成人精品日本亚洲11| 国产精品久久久久久免费免熟| 不卡一区中文字幕| 国产成人看片| 国产在线观看免费网站| 久久影院午夜片一区| 精品蜜桃传媒| 国产区在线看| 在线观看视频一区二区欧美日韩| 91黄色小网站| 久久久久久亚洲精品美女 | 在线观看亚洲国产| 99在线精品观看| 国产精品白丝jk白祙| 粉嫩av在线播放| 中文欧美字幕免费| 成人免费观看cn| 日韩高清在线观看一区二区| 日韩欧美一区在线| 天堂网成人在线| 国产精品免费99久久久| 中文字幕日韩高清| 在线免费观看毛片| 黄网站免费久久| av一区二区三区在线观看| 亚洲成a人片在线| 中文字幕av不卡| 免费黄色日本网站| 新片速递亚洲合集欧美合集| 欧美日韩中文国产| 一级 黄 色 片一| 亚洲乱码一区| 另类少妇人与禽zozz0性伦| 欧美成欧美va| 亚洲精品字幕| 国产精品丝袜久久久久久高清 | 国产精品99久久久久久有的能看| 国产精品电影观看| 一区二区视频免费观看| 国内久久精品视频| 亚洲精品久久久久久一区二区| 欧美成人精品三级网站| 亚洲欧美激情精品一区二区| 亚洲欧美va天堂人熟伦| 91成人网在线观看| 国产精选久久久久久| av片在线看| 亚洲成人av一区二区三区| 日本女人性视频| 欧洲亚洲成人| 日韩有码在线观看| 国产精品999久久久| 国产白丝网站精品污在线入口| 欧美成熟毛茸茸复古| 视频三区在线| 欧美日韩免费看| 欧美特黄aaa| 精品欧美午夜寂寞影院| 这里只有精品视频在线| 亚洲午夜无码久久久久| 丰满少妇久久久久久久| 青草网在线观看| 黄色美女久久久| 欧美一区二区三区精品电影| 国产精品久久久久久久久久久久久久久久久久 | 国产视频一视频二| 一区二区三区日本久久久 | 深夜国产在线播放| 欧美成人高清电影在线| 日本a在线观看| 26uuuu精品一区二区| 亚洲五月天综合| 中文字幕区一区二区三| 欧美精品久久久久| 天堂a中文在线| 一区二区三区中文字幕精品精品| 日韩少妇内射免费播放| 欧美猛男男男激情videos| 欧美激情一级欧美精品| 午夜在线观看视频18| 91国模大尺度私拍在线视频| 国产免费久久久久| 丝袜亚洲另类欧美| 久久国产精品-国产精品| 亚洲伊人av| 亚洲成人久久网| 国产美女激情视频| 成人午夜在线视频| 乱妇乱女熟妇熟女网站| 久久中文亚洲字幕| 动漫精品视频| 成人国产激情| 伊人伊人伊人久久| 国产午夜性春猛交ⅹxxx| 成人综合激情网| 妺妺窝人体色www在线观看| 一区二区蜜桃| 欧美性xxxx69| 成人另类视频| 欧美激情精品久久久久久免费印度| 日韩电影在线观看完整版| 亚洲成人一二三| 亚洲一级理论片| 蓝色福利精品导航| 亚洲丰满在线| 欧美日韩夜夜| 999热视频| 污视频网站免费在线观看| 亚洲欧美激情四射在线日| 亚洲成人77777| 在线成人高清不卡| 在线日韩国产网站| 91美女精品福利| 最新版天堂资源在线| 极品少妇xxxx偷拍精品少妇| 美女福利视频在线| 精品二区久久| 日韩中文字幕在线不卡| 日韩精品电影| 日本日本精品二区免费| 日韩成人一级| 精品一区久久久久久| 北条麻妃一区二区三区在线| 91九色国产社区在线观看| 最新日韩一区| 国产a级全部精品| 夜鲁夜鲁夜鲁视频在线播放| 亚洲欧美一区二区激情| 亚洲va久久久噜噜噜无码久久| 欧美妇女性影城| 天天天天天天天干| 色婷婷精品久久二区二区蜜臂av| 国产情侣在线视频| 久久精品视频免费| av免费观看国产| 欧美1区视频| 美女三级99| 另类春色校园亚洲| 国产偷国产偷亚洲高清97cao| 欧美色网一区| 热门国产精品亚洲第一区在线| а√天堂中文在线资源bt在线| 精品视频在线播放免| 中文字幕一区2区3区| 色狠狠一区二区三区香蕉| 日韩在线视频不卡| 亚洲精品免费在线观看| 暗呦丨小u女国产精品| 亚洲视频在线一区| 800av在线播放| 暴力调教一区二区三区| 国产日韩视频一区| 99精品一区二区三区| 精品久久久久久中文字幕人妻最新| 麻豆精品视频在线观看视频| 我看黄色一级片| 亚洲天堂黄色| 一区二区三区四区欧美日韩| 一区二区三区四区高清视频| 91gao视频| 狼人精品一区二区三区在线 | 欧美精品一区二区久久| 91在线精品观看| 136福利精品导航| 国产欧美亚洲日本| 亚洲日本三级| 亚洲资源在线网| 欧美在线视屏| 国产精品无码av在线播放| 日韩高清一区在线| 日韩在线视频在线观看| 快she精品国产999| 色91精品久久久久久久久| 亚洲免费综合| 和岳每晚弄的高潮嗷嗷叫视频| 亚洲精品精选| 我看黄色一级片| 成人精品视频一区| 在线不卡av电影| 2020日本不卡一区二区视频| 国产精品18在线| 亚洲国产另类av| 久久久久精彩视频| 亚洲天堂成人| 5278欧美一区二区三区| 国产精品av一区二区三区| 国产日韩欧美中文| 忘忧草在线日韩www影院| 国产成人精品av在线| 日本蜜桃在线观看视频| 欧美高清性猛交| 涩涩av在线| 91久久嫩草影院一区二区| 五月激激激综合网色播| 国产av第一区| 狂野欧美性猛交xxxx巴西| 日韩精品xxx| 日本一区二区三区在线观看| 青青草视频播放| 99视频精品免费视频| 亚洲精品国产精品国自| 久久久久国产精品人| 99久久婷婷国产综合| 亚洲天堂福利av| 日本亚洲色大成网站www久久| 欧美日本一区二区在线观看| 人妻精品一区二区三区| 亚洲成人精品av| 麻豆传媒视频在线| 社区色欧美激情 | 麻豆91在线| 日本精品免费一区二区三区| 99re热精品视频| 日本黄色播放器| 天天综合亚洲| 日本成人中文字幕在线| 99久久99久久精品免费看蜜桃| 午夜免费激情视频| 欧美色综合久久| 蝌蚪视频在线播放| 在线国产精品播放| 成人性生交大片免费网站| 鬼打鬼之黄金道士1992林正英| 999视频精品| 99热这里只有精品在线播放| 久久久精品一品道一区| 日韩福利片在线观看| 精品三级av在线| av中文字幕在线观看| 成人黄色生活片| 一区视频网站| 欧美一级免费在线观看| 精久久久久久久久久久| 日韩av毛片在线观看| 欧美日韩亚洲国产综合| av中文字幕在线| 国产精品 欧美在线| 中国av一区| 免费激情视频在线观看| 国产日韩欧美制服另类| 亚洲欧美日韩激情| 欧美二区三区91| 五月婷婷在线观看| 国产美女久久精品香蕉69| 日韩精品网站| 免费网站在线观看黄| 亚洲日本一区二区三区| 国产精品久久影视| 久久综合久久八八| 日韩精品中文字幕吗一区二区| 黄色激情在线视频| 久久亚洲一区| 国产aⅴ激情无码久久久无码| 亚洲色图19p| 国产视频在线观看免费| 久久成人人人人精品欧| 亚洲精品a区| 欧美 日韩 国产在线观看| 91在线免费播放| 国产精品乱码一区二区视频| 这里只有精品视频在线| 996久久国产精品线观看| 国产精品免费在线| 亚洲清纯自拍| 三级电影在线看| 欧美视频一区二区三区四区| 午夜黄色小视频| 日本精品视频网站| 久久精品国产www456c0m| 无码人妻少妇色欲av一区二区| 性做久久久久久久久| 美女毛片在线看| 国产欧美一区二区三区久久| 国产精品av久久久久久麻豆网| yy6080午夜| 欧美日韩在线免费视频| 色帝国亚洲欧美在线| 久久精品第九区免费观看| 美女www一区二区| 久久伊人成人网| 亚洲欧美国产精品va在线观看| 亚洲精品大全| 欧美国产激情视频| 中文字幕一区二区视频| 国产女主播喷水视频在线观看 | 欧美日韩视频第一区| 青青草原国产在线| 国产精品wwww| 欧美久久九九| 青娱乐国产视频| 亚洲精品一区在线观看| 国产精品偷拍| 日韩区国产区| 奇米精品一区二区三区在线观看一 | 久久不见久久见国语|