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

打破迷思:為什么資深 C++ 開發(fā)者幾乎總是選擇 vector 而非 list

開發(fā)
今天,我要帶你進入真實的C++江湖,揭開vector和list性能的真相,幫你徹底搞懂這個看似簡單卻被無數(shù)程序員誤解的選擇題。

一、前言:打破你對容器選擇的固有認知

嘿,C++小伙伴們!面對這段代碼,你會怎么選?

// 存儲用戶信息,需要頻繁查找、偶爾在中間插入刪除
// 選擇哪個容器實現(xiàn)?
std::vector<UserInfo> users;  // 還是
std::list<UserInfo> users;    // ?

如果你剛學習C++,可能會想:"數(shù)據(jù)會變動,肯定用list啊!教材上說鏈表插入刪除快嘛!"

然后有一天,你看到一位經(jīng)驗豐富的同事把所有l(wèi)ist都改成了vector,并且代碼性能提升了,你一臉懵逼: "這跟我學的不一樣啊!"

是的,傳統(tǒng)教科書告訴我們:

  • 數(shù)組(vector):隨機訪問快,插入刪除慢
  • 鏈表(list):插入刪除快,隨機訪問慢

但實際工作中,大多數(shù)資深C++開發(fā)者卻幾乎總是使用vector。為什么會這樣?是教材錯了,還是大佬們有什么不可告人的秘密?

今天,我要帶你進入真實的C++江湖,揭開vector和list性能的真相,幫你徹底搞懂這個看似簡單卻被無數(shù)程序員誤解的選擇題。

深入閱讀后,你會發(fā)現(xiàn):這個選擇背后,涉及現(xiàn)代計算機體系結構、內(nèi)存模型和真實世界的性能考量,而不僅僅是算法復雜度的簡單對比。

二、理論上:vector和list各是什么?

先來個直觀的比喻:

  • vector就像一排連續(xù)的座位:大家坐在一起,找人超快,但中間插入一個人就需要后面的人都往后挪。
  • list就像一群手拉手的人:每個人只知道自己左右鄰居是誰,找到第n個人必須從頭數(shù),但中間插入一個人只需要改變兩邊人的"指向"。

技術上講:

  • vector:連續(xù)內(nèi)存,支持隨機訪問(可以直接訪問任意位置),內(nèi)存布局緊湊
  • list:雙向鏈表,只支持順序訪問(必須從頭/尾遍歷),內(nèi)存布局分散

1. vector和list的內(nèi)部結構對比

(1) vector的內(nèi)部結構:

[元素0][元素1][元素2][元素3][元素4][...]
 ↑                               ↑
begin()                        end()

vector內(nèi)部其實就是一個動態(tài)擴展的數(shù)組,它有三個重要指針:

  • 指向數(shù)組開始位置的指針start
  • 指向最后一個元素后面位置的指針end
  • 指向已分配內(nèi)存末尾的指針(容量capacity)

當空間不夠時,vector會重新分配一塊更大的內(nèi)存(通常是當前大小的1.5或2倍),然后把所有元素搬過去,就像搬家一樣。

(2) list的內(nèi)部結構:

┌──────┐    ┌──────┐    ┌──────┐
   │ prev │?───┤ prev │?───┤ prev │
┌──┤ data │    │ data │    │ data │
│  │ next │───?│ next │───?│ next │
│  └──────┘    └──────┘    └──────┘
│     節(jié)點0        節(jié)點1       節(jié)點2
↓
nullptr

list是由一個個獨立的節(jié)點組成,每個節(jié)點包含三部分:

  • 存儲的數(shù)據(jù)
  • 指向前一個節(jié)點的指針
  • 指向后一個節(jié)點的指針

這就像一個手拉手的圓圈游戲,每個人只能看到左右兩個人,要找到第五個人,必須從第一個開始數(shù)。

這兩種容器結構上的差異,決定了它們在不同操作上的性能表現(xiàn)。vector因為內(nèi)存連續(xù),所以可以通過簡單的指針算術直接跳到任意位置;而list必須一個節(jié)點一個節(jié)點地遍歷才能到達指定位置。

按照傳統(tǒng)教科書,它們的復雜度對比是這樣的:

操作

vector

list

隨機訪問

O(1)

O(n)

頭部插入/刪除

O(n)

O(1)

尾部插入/刪除

均攤 O(1)

O(1)

中間插入/刪除

O(n)

O(1)*

*注意:list 的中間插入/刪除是O(1),但前提是你已經(jīng)有了指向該位置的迭代器,找到這個位置通常需要O(n)時間。

看上去 list 在插入刪除方面優(yōu)勢明顯,但為什么那么多經(jīng)驗豐富的程序員卻建議"幾乎總是用vector"呢?

三、現(xiàn)實很殘酷:理論≠實踐

老鐵,上面的理論分析忽略了一個超級重要的現(xiàn)代計算機特性:緩存友好性。

1. 什么是緩存友好性?

想象你去圖書館看書:

  • vector就像是把一整本書借出來放在你桌上(數(shù)據(jù)連續(xù)存儲)
  • list就像是每看一頁就得去書架上找下一頁(數(shù)據(jù)分散存儲)

現(xiàn)代CPU都有緩存機制,當訪問一塊內(nèi)存時,會把周圍的數(shù)據(jù)也一并加載到緩存。對于連續(xù)存儲的vector,這意味著一次加載多個元素;而對于分散存儲的list,每次可能只能有效加載一個節(jié)點。

2. 實際性能測試

我做了一個簡單測試,分別用vector和list存儲100萬個整數(shù),然后遍歷求和:

// Vector遍歷測試 - 使用微秒計時更精確
auto start = chrono::high_resolution_clock::now();
int sum_vec = 0;
for (auto& num : vec) {
     sum_vec += num;
 }
auto end = chrono::high_resolution_clock::now();
auto vector_time = chrono::duration_cast<chrono::microseconds>(end - start).count();

// List遍歷測試 - 使用微秒計時更精確
 start = chrono::high_resolution_clock::now();
int sum_list = 0;
for (auto& num : lst) {
     sum_list += num;
 }
 end = chrono::high_resolution_clock::now();
auto list_time = chrono::duration_cast<chrono::microseconds>(end - start).count();

// 輸出結果 - 微秒顯示,并轉換為毫秒顯示
....

結果震驚了我:

這是30幾倍的差距!為啥?就是因為緩存友好性!

四、list的"快速插入"真的快嗎?

我們再來測試一下在容器中間位置插入元素的性能:

cout << "開始性能測試..." << endl;

// 在vector中間插入
auto start = chrono::high_resolution_clock::now();
for (int i = 0; i < INSERT_COUNT; i++) {
     vec.insert(vec.begin() + vec.size() / 2, i);
 }
auto end = chrono::high_resolution_clock::now();
auto vector_time = chrono::duration_cast<chrono::milliseconds>(end - start).count();
auto vector_time_micros = chrono::duration_cast<chrono::microseconds>(end - start).count();

// 在list中間插入(先找到中間位置)
 start = chrono::high_resolution_clock::now();
for (int i = 0; i < INSERT_COUNT; i++) {
     auto it = lst.begin();
     advance(it, lst.size() / 2);
     lst.insert(it, i);
 }
 end = chrono::high_resolution_clock::now();
auto list_time = chrono::duration_cast<chrono::milliseconds>(end - start).count();
auto list_time_micros = chrono::duration_cast<chrono::microseconds>(end - start).count();

// 輸出結果

測試結果:

驚不驚喜?意不意外?理論上應該更快的list,在實際插入操作上反而比vector慢了90多倍!

這是因為:

  • 尋找list中間位置需要O(n)時間,這個成本非常高
  • list的每次插入都可能導致緩存不命中
  • list的節(jié)點分配需要額外的內(nèi)存管理開銷

五、實際項目中vector的優(yōu)勢

現(xiàn)實項目中,vector幾乎總是勝出,因為:

1. 緩存友好性:現(xiàn)代CPU的加速器

當CPU訪問內(nèi)存時,會一次性加載多個相鄰元素到緩存。vector的連續(xù)內(nèi)存布局完美匹配這一機制:

內(nèi)存訪問示意圖:
                    ┌─────────── CPU緩存行 ─────────────┐
Vector: [0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15]...
                    └───────────────────────────────────┘
                    一次加載多個元素到緩存

這讓遍歷vector的速度遠超list,抵消了理論算法復雜度上的劣勢。

2. 內(nèi)存效率高

vector僅需一次大內(nèi)存分配,而list需要為每個元素單獨分配節(jié)點:

  • 減少內(nèi)存碎片
  • 降低內(nèi)存分配器壓力
  • 節(jié)省指針開銷(每個list節(jié)點額外需要兩個指針)

3. 預分配提升性能

通過reserve()預分配空間,可以進一步提升vector性能:

vector<int> v;
v.reserve(10000);  // 一次性分配10000個元素的空間
// 接下來的插入操作不會觸發(fā)重新分配

4. 符合常見使用模式

大多數(shù)程序主要是遍歷和訪問操作,這正是vector的強項。

六、什么時候應該考慮用list?

雖然vector在大多數(shù)情況下是首選,但list在某些特定場景下確實有其不可替代的優(yōu)勢:

1. 需要穩(wěn)定的迭代器和引用

一個重要的差異是迭代器穩(wěn)定性:

vector<int> vec = {1, 2, 3, 4};
list<int> lst = {1, 2, 3, 4};

// 獲取指向第2個元素的迭代器
auto vec_it = vec.begin() + 1;  // 指向2
auto lst_it = lst.begin();
advance(lst_it, 1);  // 指向2

// 在開頭插入元素
vec.insert(vec.begin(), 0);  // vector的所有迭代器可能失效!
lst.insert(lst.begin(), 0);  // list的迭代器仍然有效

// 這個操作對vector是危險的,可能導致未定義行為
// cout << *vec_it << endl;  // 原來指向2,現(xiàn)在可能無效

// 這個操作對list是安全的
cout << *lst_it << endl;  // 仍然正確指向2

當你需要保持迭代器在插入操作后仍然有效,list可能是更安全的選擇。

2. 需要O(1)時間拼接操作

list有一個特殊操作splice(),可以在常數(shù)時間內(nèi)合并兩個list:

list<int> list1 = {1, 2, 3};
list<int> list2 = {4, 5, 6};

// 將list2的內(nèi)容移動到list1的末尾,O(1)時間
list1.splice(list1.end(), list2);

// 此時list1包含{1,2,3,4,5,6},list2為空

vector沒有對應的操作——合并兩個vector需要O(n)時間。

3. 超大對象的特殊情況

當元素是非常大的對象,并且:

  • 移動成本高(沒有高效的移動構造函數(shù))
  • 頻繁在已知位置插入/刪除

這種情況下,list可能更有效率。但這種場景相當少見,尤其是在現(xiàn)代C++中,大多數(shù)類都應該實現(xiàn)高效的移動語義。

七、那list有什么缺陷呢?

既然list在某些場景下有優(yōu)勢,為什么我們不默認使用它呢?實際上,list存在幾個嚴重的缺陷,使得它在大多數(shù)實際場景中表現(xiàn)不佳:

1. 緩存不友好的內(nèi)存訪問模式

list最大的問題是其節(jié)點分散在內(nèi)存各處,導致CPU緩存效率極低:

內(nèi)存訪問示意圖:
List: [節(jié)點1] → [節(jié)點2] → [節(jié)點3] → [節(jié)點4] → ...
       ↑          ↑          ↑          ↑
     內(nèi)存1      內(nèi)存2      內(nèi)存3      內(nèi)存4    (分散在內(nèi)存各處)
     
CPU緩存: [加載節(jié)點1]  [節(jié)點1過期,加載節(jié)點2]  [節(jié)點2過期,加載節(jié)點3] ...
         ↑            ↑                      ↑
      緩存未命中     緩存未命中           緩存未命中

每訪問一個新節(jié)點,幾乎都會導致"緩存未命中",迫使CPU從主內(nèi)存讀取數(shù)據(jù),這比從緩存讀取慢10-100倍。這是list在遍歷操作中表現(xiàn)糟糕的主要原因。

2. 驚人的內(nèi)存開銷

每個list節(jié)點都包含額外的指針開銷:

template <typename T>
struct list_node {
    T data;
    list_node* prev;
    list_node* next;
};

在64位系統(tǒng)上,每個指針占8字節(jié)。對于小型數(shù)據(jù)(如int),這意味著存儲一個4字節(jié)的值需要額外16字節(jié)的開銷——總共20字節(jié),是原始數(shù)據(jù)大小的5倍!

實際測試對比:

vector<int> vec(1000000);
list<int> lst(1000000);

cout << "Vector內(nèi)存占用: " << sizeof(int) * vec.size() << "字節(jié)\n";
cout << "List估計內(nèi)存占用: ≈" << (sizeof(int) + 2 * sizeof(void*)) * lst.size() << "字節(jié)\n";

結果:

Vector內(nèi)存占用: 4000000字節(jié)
List估計內(nèi)存占用: ≈20000000字節(jié)

5倍的內(nèi)存開銷!在大型應用中,這種差異會導致顯著的內(nèi)存壓力和更頻繁的垃圾回收。

3.  頻繁內(nèi)存分配的隱藏成本

list的另一個問題是頻繁的小規(guī)模內(nèi)存分配:

// list需要1000000次單獨的內(nèi)存分配
list<int> lst;
for (int i = 0; i < 1000000; i++) {
    lst.push_back(i);  // 每次都分配新節(jié)點
}

// vector只需要約20次內(nèi)存分配
vector<int> vec;
for (int i = 0; i < 1000000; i++) {
    vec.push_back(i);  // 大多數(shù)操作不需要新分配
}

每次內(nèi)存分配都有開銷,涉及到內(nèi)存分配器的復雜操作和可能的鎖競爭。這些都是教科書算法分析中忽略的成本。

4. 內(nèi)存碎片化問題

list的節(jié)點分散在堆上,可能導致嚴重的內(nèi)存碎片:

內(nèi)存布局示意圖:
[list節(jié)點] [其他程序數(shù)據(jù)] [list節(jié)點] [其他數(shù)據(jù)] [list節(jié)點] ...

這種碎片化可能導致:

  • 更高的內(nèi)存使用峰值
  • 更低的內(nèi)存分配效率
  • 更差的整體系統(tǒng)性能

相比之下,vector的連續(xù)內(nèi)存模型不會造成這種問題。

這些缺陷綜合起來,使得 list 在絕大多數(shù)實際應用場景中都不如 vector,除非你確實需要前面提到的那些特殊優(yōu)勢。實踐表明,大多數(shù)開發(fā)者認為 vector 應該是默認選擇,只有在確實需要 list 特性時才考慮使用它。

八、實戰(zhàn)案例:一個簡單的任務隊列

來看個實際例子 - 實現(xiàn)一個簡單的任務隊列,任務會從隊尾添加,從隊首取出執(zhí)行:

// vector實現(xiàn)
class VectorQueue {
private:
    vector<Task> tasks;
public:
    void addTask(Task t) {
        tasks.push_back(std::move(t));
    }
    
    Task getNext() {
        Task t = std::move(tasks.front());
        tasks.erase(tasks.begin());  // O(n)操作,性能瓶頸
        return t;
    }
};

// list實現(xiàn)
class ListQueue {
private:
    list<Task> tasks;
public:
    void addTask(Task t) {
        tasks.push_back(std::move(t));
    }
    
    Task getNext() {
        Task t = std::move(tasks.front());
        tasks.pop_front();  // O(1)操作
        return t;
    }
};

下面是任務數(shù)分別為 500、5000、50000 的測試數(shù)據(jù)結果對比:

在這個任務隊列的例子中,測試結果清晰地表明:list版本確實在實際應用中表現(xiàn)更佳。即使在小規(guī)模場景下,list的執(zhí)行速度已經(jīng)比 vector 快約4倍,而隨著任務量增加,這種差距迅速擴大。這是因為隊列的核心操作(從頭部刪除)正好命中了 vector 的性能弱點,而完美契合list的強項。

當你的應用需要頻繁從隊首刪除元素時,list(或deque)通常是更合適的選擇。

九、更全面的對比:vector、list還是deque?

說了這么多 vector 和 list 的對比,但實際上還有一個容器可能是更好的選擇——std::deque(雙端隊列)。

1. deque:魚與熊掌可以兼得

deque的內(nèi)部結構是分段連續(xù)的:由多個連續(xù)內(nèi)存塊通過指針連接。

[塊0: 連續(xù)內(nèi)存]--->[塊1: 連續(xù)內(nèi)存]--->[塊2: 連續(xù)內(nèi)存]--->...

這種結構帶來獨特的優(yōu)勢:

  • 支持O(1)時間的隨機訪問(像vector)
  • 支持O(1)時間的兩端插入/刪除(像list)
  • 在中間插入/刪除的平均性能介于vector和list之間
  • 不需要像vector那樣連續(xù)重新分配內(nèi)存

2. 三種容器的全面對比

特性/操作

vector

list

deque

隨機訪問

O(1)

O(n)

O(1)

頭部插入/刪除

O(n)

O(1)

O(1)

尾部插入/刪除

均攤 O(1)

O(1)

O(1)

中間插入/刪除

O(n)

O(1)*

O(n)

內(nèi)存布局

完全連續(xù)

完全分散

分段連續(xù)

緩存友好性

極好

極差

良好

迭代器/引用穩(wěn)定性

內(nèi)存開銷

適用場景

適合數(shù)據(jù)較穩(wěn)定且主要進行隨機訪問和遍歷

適合需要迭代器穩(wěn)定性和在已知位置頻繁修改的特殊場景

適合需要在兩端操作但又不想放棄隨機訪問能力的場景

*前提是已經(jīng)有指向該位置的迭代器

十、實際項目中的容器選擇策略

基于以上分析,我總結出一套實用的選擇策略:

1. 默認選擇vector的理由

  • 緩存友好性是決定性因素:在現(xiàn)代硬件上,內(nèi)存訪問模式比理論算法復雜度更重要
  • 大多數(shù)操作是查找和遍歷:實際代碼中,這些操作占比往往超過80%
  • 連續(xù)內(nèi)存有額外好處:更好的空間局部性、更少的內(nèi)存分配、更少的緩存未命中
  • 大部分插入發(fā)生在末尾:vector在末尾插入幾乎和list一樣快

2. 實用決策流程圖

是否需要頻繁隨機訪問?
└── 是 → 是否需要頻繁在兩端插入/刪除?
│       └── 是 → 使用deque
│       └── 否 → 使用vector
└── 否 → 是否有以下特殊需求?
        ├── 需要穩(wěn)定的迭代器 → 使用list
        ├── 需要O(1)拼接操作 → 使用list
        ├── 需要在已知位置頻繁插入/刪除 → 使用list
        └── 沒有特殊需求 → 使用vector

3. 最佳實踐:測試為王

如果你對性能有嚴格要求,最好方法是在你的實際場景下測試不同容器:

#include <chrono>
#include <vector>
#include <list>
#include <deque>
#include <iostream>
usingnamespacestd;

template<typename Container>
void performTest(const string& name) {
    auto start = chrono::high_resolution_clock::now();
    
    // 在這里使用容器執(zhí)行你的實際操作
    Container c;
    for (int i = 0; i < 100000; i++) {
        c.push_back(i);
    }
    
    // 更多實際操作...
    
    auto end = chrono::high_resolution_clock::now();
    cout << name << "耗時: "
         << chrono::duration_cast<chrono::milliseconds>(end - start).count() 
         << "ms\n";
}

int main() {
    performTest<vector<int>>("Vector");
    performTest<list<int>>("List");
    performTest<deque<int>>("Deque");
    return0;
}

十一、結語:打破固有思維,選擇最適合的工具

回顧整篇文章,我們可以得出幾個關鍵結論:

  • 理論復雜度≠實際性能:緩存友好性、內(nèi)存分配策略等因素在現(xiàn)代硬件上往往比算法復雜度更重要
  • vector在絕大多數(shù)場景下是最佳選擇:它的緩存友好性和內(nèi)存效率通常抵消了理論上在插入/刪除操作的劣勢
  • list的應用場景較為特殊:只有在確實需要穩(wěn)定的迭代器、常數(shù)時間的拼接等特性時才考慮使用
  • deque是一個被低估的選擇:在需要頻繁兩端操作時,它結合了vector和list的優(yōu)點
  • 要避免過早優(yōu)化:先用最簡單的解決方案(通常是vector),只有在真正需要時才考慮優(yōu)化
  • 記住Donald Knuth的名言:"過早優(yōu)化是萬惡之源"。在沒有實際性能問題之前,選擇最簡單、最易維護的容器(通常是vector)可能是最明智的決定。

如果你確實需要優(yōu)化,別忘了進行真實環(huán)境的測試,而不只是依賴理論分析。

責任編輯:趙寧寧 來源: 跟著小康學編程
相關推薦

2013-04-25 10:14:39

Facebook開發(fā)者開發(fā)

2018-03-23 08:31:36

2012-07-13 13:51:57

AndroidiOS

2025-04-24 08:00:00

C++內(nèi)存管理開發(fā)

2013-03-28 19:25:35

騰訊云

2015-07-29 09:53:57

前端開發(fā)總結

2020-02-13 17:49:55

SpringBoot放棄選擇

2022-06-14 11:01:48

SpringBootTomcatUndertow

2012-12-26 09:51:52

C++開發(fā)者C++ CX

2013-09-05 11:04:53

C++開發(fā)者

2017-02-10 09:55:53

SwiftObjective-C

2025-02-17 08:10:00

C++代碼lambda

2025-03-25 07:10:00

開發(fā)前端JavaScript

2024-10-06 13:47:43

后端開發(fā)者項目

2024-10-06 13:00:05

2010-11-24 10:35:40

Objective-C

2010-06-11 13:28:06

PHPPython

2014-04-15 11:27:50

C++開發(fā)者Objective-C核心語法

2015-02-11 09:30:19

Swift1.2

2015-02-11 09:54:17

Swift
點贊
收藏

51CTO技術棧公眾號

狠狠色综合网站久久久久久久| 精品国产免费一区二区三区香蕉| 九九九九九九精品| 在线天堂中文字幕| 亚洲成a人片77777在线播放| 一本一道综合狠狠老| 五月天色一区| 亚洲精品久久久久久久久久久久久久| 亚洲精品视频啊美女在线直播| 亚洲日韩欧美视频| 日日夜夜精品视频免费观看| 美女露胸视频在线观看| 亚洲欧洲性图库| 岛国视频一区免费观看| 国产乱码77777777| 一区二区中文| 亚洲欧美日韩精品久久亚洲区| 在线观看av免费观看| 国产污视频在线播放| 久久久久国产精品人| 国产精品自在线| 国产亚洲欧美久久久久| 日韩精品网站| 国产丝袜精品第一页| 国产黄色一区二区三区| 亚洲mmav| 精品久久久久久中文字幕一区奶水| 日韩av大全| 天天干免费视频| 韩国v欧美v亚洲v日本v| 国产精彩精品视频| 久久国产在线观看| 午夜精品毛片| 最近2019好看的中文字幕免费| 星空大象在线观看免费播放| 国产欧美88| 欧美日韩情趣电影| 久久久久久久久久久99| 日韩三级免费| 亚洲欧美国产毛片在线| 亚洲高清视频一区二区| 你懂的在线视频| 亚洲欧美另类一区| 国产成人福利av| 欧美麻豆精品久久久久久| 精品一卡二卡三卡| 2020国产在线| 亚洲激情av在线| 亚洲一区三区视频在线观看| 国产系列电影在线播放网址| 91蜜桃网址入口| 国产精品一区免费观看| 精品久久久无码中文字幕| 极品美女销魂一区二区三区 | 伊人久久成人| 欧美精品少妇videofree| 亚洲a∨无码无在线观看| 国模精品一区| 在线播放日韩专区| 国产毛片欧美毛片久久久| 精品国产一区二区三区小蝌蚪| 亚洲午夜久久久久久久| 国产黄片一区二区三区| 国产99久久精品一区二区300| 亚洲美女性生活视频| 久久亚洲AV成人无码国产野外| 狼人精品一区二区三区在线| 亚洲精品www| 日本黄色网址大全| 精品国产网站| 中文字幕亚洲在线| 99鲁鲁精品一区二区三区| 欧美色图一区| 另类图片亚洲另类| 黄色一级免费视频| 亚洲精品乱码| 日韩美女在线观看| 中文字幕欧美人妻精品一区蜜臀| 麻豆国产欧美一区二区三区| 91免费在线视频网站| 亚洲爱情岛论坛永久| 不卡av电影在线播放| 欧美日韩一区二区视频在线| 永久免费av在线| 一区二区三区视频在线看| 日韩精品一区二区免费| 成人免费看黄| 欧美高清性hdvideosex| 熟妇高潮一区二区| 伊人精品一区| 久久艹在线视频| 国产精品黄色网| 视频在线在亚洲| 亚洲综合中文字幕在线| 香蕉av在线播放| 国产精品色哟哟| 免费高清一区二区三区| 日韩精品一区二区三区| 91精品国产麻豆国产自产在线| 中文字幕天堂网| 郴州新闻综合频道在线直播| 欧美人在线观看| 日本黄色一级视频| 国产成人在线电影| 日韩欧美精品一区二区三区经典| caoporn97在线视频| 欧美午夜精品久久久久久久| 超碰成人在线播放| 欧美日韩另类图片| 久久精品视频播放| 国产一级一级国产| 成人免费毛片高清视频| 在线天堂一区av电影| 美女91在线看| 91精品国产色综合久久久蜜香臀| 大黑人交xxx极品hd| 欧美+日本+国产+在线a∨观看| 国产成人av网址| www久久久久久| 中文字幕高清不卡| 国产精品一区二区免费在线观看| 日韩av黄色| 日韩精品视频免费在线观看| 69xx绿帽三人行| 日韩精品午夜视频| 精品一区二区三区免费毛片| 亚洲www色| 欧美美女喷水视频| 一区二区三区伦理片| 亚洲电影av| 91福利视频导航| 日本www在线| 在线免费视频一区二区| 天堂久久久久久| 国产精品豆花视频| 91免费人成网站在线观看18| 在线观看国产原创自拍视频| 色猫猫国产区一区二在线视频| 中文字幕一区二区三区乱码不卡| 国产精品av久久久久久麻豆网| 国产精品一香蕉国产线看观看| 欧美新色视频| 黑人巨大精品欧美一区二区一视频 | 免费黄色国产视频| 蜜臀99久久精品久久久久久软件| 蜜桃麻豆91| 中文字幕在线中文字幕在线中三区| 精品噜噜噜噜久久久久久久久试看 | jizz中国女人| 亚洲精品日产精品乱码不卡| 天天看片天天操| 99九九热只有国产精品| 国产精品亚洲片夜色在线| 国产精品免费观看| 欧美中文字幕亚洲一区二区va在线| 亚洲av综合一区二区| 午夜影院日韩| 欧美一区1区三区3区公司 | yiren22综合网成人| 欧美性猛交xxxx偷拍洗澡| 青青草视频播放| 免费日韩一区二区| 欧洲在线视频一区| 国产精品66| 久久久精品免费| xxxx18国产| 亚洲成av人片在线| 人妻丰满熟妇av无码久久洗澡| 国产婷婷精品| 色一情一区二区三区四区| 精品欧美一区二区三区在线观看| 中日韩美女免费视频网站在线观看| 一级黄色小视频| 亚洲免费在线视频一区 二区| 韩国三级在线播放| 国模吧视频一区| 鲁丝一区二区三区免费| 三上悠亚激情av一区二区三区| 中文字幕日韩av综合精品| 亚洲综合免费视频| 亚洲品质自拍视频| 日日夜夜精品视频免费观看| 亚洲欧洲一级| 亚洲.欧美.日本.国产综合在线 | 成人av片网址| 免费高潮视频95在线观看网站| 亚洲人成在线一二| 国产露脸91国语对白| 亚洲一区二区不卡免费| 少妇精品一区二区三区| 久久97超碰国产精品超碰| 欧美日韩激情四射| 国产精品嫩模av在线| 91九色在线视频| 小草在线视频免费播放| 菠萝蜜影院一区二区免费| 欧美熟女一区二区| 欧美日韩在线直播| 麻豆一区二区三区精品视频| 国产亚洲短视频| 中文字幕无人区二| 视频一区欧美精品| 欧美日韩激情四射| 国产尤物久久久| 粉嫩av一区二区三区免费观看| 亚洲黄色中文字幕| 九九热视频这里只有精品| 免费在线超碰| 日韩女优av电影| 91在线视频免费播放| 亚洲自拍偷拍图区| 亚洲黄色免费视频| 国产成人免费视频网站高清观看视频| 丰满少妇被猛烈进入高清播放| 亚洲久久久久| 视频一区二区三| 国产精品自在线拍| 亚洲一区制服诱惑| 高清亚洲高清| 日本不卡高字幕在线2019| www.在线视频| 日韩性xxxx爱| 国产三级在线| 日韩av在线导航| 亚洲国产一二三区| 欧美精品日韩综合在线| 亚洲欧美一二三区| 精品国产电影一区| 久久久国产成人| 亚洲人成影院在线观看| 日本女人性生活视频| 国产色产综合色产在线视频| 亚洲观看黄色网| 成人av网站在线| 日本精品一二三| 国产精品一区二区久久不卡| 99re成人精品视频| 亚洲污视频在线观看| 免费永久网站黄欧美| 亚洲熟妇国产熟妇肥婆| 国产精品大片| 国产xxxx振车| 欧美日韩亚洲一区三区| 奇米777四色影视在线看| 午夜精品一区二区三区国产| 伊人久久青草| 羞羞答答成人影院www| 亚洲人久久久| 91欧美日韩| 伊人av成人| 亚州av乱码久久精品蜜桃| 亚洲欧美日韩国产yyy| 精品国产精品久久一区免费式| 日本一区二区精品视频| 蜜桃国内精品久久久久软件9| 精品视频第一区| 欧美韩一区二区| 精品视频免费观看| 亚洲警察之高压线| 茄子视频成人在线观看| 日本一区二区在线看| 亚洲三区视频| 中文字幕一区二区三区欧美日韩 | 中国极品少妇videossexhd| 国产精品99久久久| 黑森林av导航| 91小视频免费观看| 欧美激情亚洲色图| 国产精品乱码一区二区三区软件| 国产aaaaaaaaa| 亚洲精品日日夜夜| 日韩黄色a级片| 色狠狠一区二区三区香蕉| 中文字幕在线视频免费| 91精品中文字幕一区二区三区| 性欧美videos另类hd| 亚洲国产三级网| 国产在线中文字幕| 中文在线不卡视频| 91三级在线| 91av在线播放视频| 69堂精品视频在线播放| 亚洲free嫩bbb| 蜜桃一区av| 神马欧美一区二区| 欧美福利网址| 日韩av在线综合| 黑人巨大精品欧美黑白配亚洲| 久久久国产精品久久久| 91片黄在线观看| 国产成人在线网址| 亚洲国产精品久久久久秋霞影院| 亚洲精品中文字幕乱码三区91| 精品视频在线免费看| 囯产精品久久久久久| 亚洲欧美中文字幕| 91在线中文| 国产成人av网| 国产伦理久久久久久妇女 | 色综合久久综合网欧美综合网| 中文在线字幕av| 精品国产精品一区二区夜夜嗨| 国产日产精品久久久久久婷婷| 另类色图亚洲色图| 日日夜夜天天综合| 国产精品久久久久久久久久久久冷| 精品国产乱码久久久久久1区2匹| 伊人网在线免费| 日韩精品电影一区亚洲| 无码人妻一区二区三区免费n鬼沢 久久久无码人妻精品无码 | 国产精品精品视频一区二区三区| 香蕉成人app| 亚洲国产一区二区精品视频| 99综合精品| 九九热视频免费| 国产欧美一区二区精品仙草咪 | 红桃视频国产精品| 日本黄大片一区二区三区| 99久久国产综合色|国产精品| 亚洲二区在线播放| 欧美伊人精品成人久久综合97 | 日韩在线视频网| 亚洲天堂免费电影| 国产99午夜精品一区二区三区 | 男女日批视频在线观看| 久草在线在线精品观看| 国产免费一区二区三区网站免费| 亚洲一二三四在线| 国产jzjzjz丝袜老师水多| 正在播放亚洲1区| 三上悠亚激情av一区二区三区| 精品在线视频一区二区| 国产一区二区三区四区三区四| 欧美一级小视频| 国产精品国产三级国产aⅴ入口 | 久草在线资源站资源站| 成人精品在线观看| 日韩欧美电影| 热久久精品免费视频| 久久综合久久久久88| 日韩av综合在线| 亚洲成成品网站| 毛片网站在线看| 成人三级在线| 欧美三级黄美女| 苍井空张开腿实干12次| 亚洲激情图片小说视频| 国产99999| 欧美激情a在线| 综合激情网...| 青青青青在线视频| av午夜精品一区二区三区| 日本在线视频免费| 亚洲高清一区二| 在线播放高清视频www| 欧美国产二区| 日本欧美一区二区在线观看| 中文字幕人妻一区二区三区在线视频| 一本大道综合伊人精品热热| 巨骚激情综合| 国产精品日韩欧美| 99久久精品国产亚洲精品 | 99在线免费视频观看| www.欧美亚洲| 在线观看日本网站| 中文字幕欧美亚洲| 国产激情一区| 国产美女主播在线| 93久久精品日日躁夜夜躁欧美| 天天操夜夜操视频| 中文字幕日韩电影| 韩国三级大全久久网站| 97超碰人人澡| 久久色中文字幕| 一级黄色片视频| 久久91亚洲精品中文字幕| 国产极品模特精品一二| 成人观看免费完整观看| 国产精品理论在线观看| 精品国产乱码一区二区三| 国模私拍视频一区| 精品久久成人| 91香蕉国产线在线观看| 精品久久久久久久久久久久| 成年人视频免费在线观看| 91九色国产在线| 国产精品久久久久久久久久妞妞| 亚洲综合欧美综合| 欧美成人欧美edvon| 国产免费不卡| 亚洲五码在线观看视频| 久久亚洲一区二区三区明星换脸| 中文亚洲av片在线观看| 欧美韩日一区二区| 精品国产成人| yjizz视频| 欧美三级韩国三级日本一级| 国产盗摄在线视频网站| 五月天婷亚洲天综合网鲁鲁鲁| 成人国产精品免费|