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

揭秘代碼效率的真相

開發 前端
本專題將分析C++各種代碼操作的效率,包括不同類型變量的存儲效率,使用智能指針、循環、函數參數、虛函數、數組等的效率,以及如何做針對性優化,或選擇更有效的替代方案。

[[382320]]

本文轉載自微信公眾號「程序喵大人」,作者程序喵大人。轉載本文請聯系程序喵大人公眾號。

本專題將分析C++各種代碼操作的效率,包括不同類型變量的存儲效率,使用智能指針、循環、函數參數、虛函數、數組等的效率,以及如何做針對性優化,或選擇更有效的替代方案。

詳細目錄看下圖:

變量存儲區域:

在C++中,變量存儲在哪類內存,取決于開發者聲明它們的方式。如果數據不連續,分成無數段分散在內存中,會降低數據的Cache命中率。因此,理解變量如何存儲非常重要。

棧空間

棧空間,通常用于存儲局部變量、函數參數、函數返回地址、函數返回前需要恢復的寄存器等。每次調用函數時,系統都會分配一段棧空間,用于存儲這些東西,函數返回時,這段棧空間會被回收,下次調用函數時,程序還可以重用這段棧空間。

一般來說,程序每個線程有固定大小的棧空間,使用多少,回收多少,只是偏移量偏移多少的問題。棧空間特別高效是因為同一段內存空間可以被反復使用,內存很容易就加載到Cache中,Cache命中率更高。

我們可以多利用棧空間。所有的變量,最好都在使用它們的函數中聲明。有些情況下可以在大括號{ }內聲明變量,盡可能縮小變量的作用域。

全局或靜態空間

全局變量,任何函數都可以訪問,存儲在內存的靜態空間中。static關鍵字聲明的變量、浮點常量、字符串常量、虛函數表等,都存儲在靜態空間中。

靜態空間的優點是,可以在程序啟動前就將其初始化為所需的值。缺點是,即使變量只使用一次,或者只在程序的一小部分中使用,它的內存,也會在程序整個運行過程中被占用,會降低Cache的效率。

盡量不要將變量聲明為全局變量,一個變量如果被多個函數使用,可以考慮將其作為參數,但是參數傳遞是有開銷的,如果我們想避免這類開銷,難道就要聲明為全局變量了嗎?其實我們也可將變量存儲在類對象中,多個函數都訪問類對象中的變量成員。

某些情況下,可以考慮static和const共用,例如聲明一個靜態常量查詢表:

  1. float SomeFunction(int x) { 
  2. static const float list[] = {1.1, 2.2, 3.4, 4.4, 5.5}; 
  3.     return list[x]; 

這種方式的好處是,不需要在每次調用函數時對列表進行初始化。static聲明意味著在第一次調用初始化后,后續就不再需要初始化,但這樣效率較低,因為需要額外檢查它是第一次調用,還是已經被調用過。加入const聲明,可以告訴編譯器,不需要對是否是第一次調用來進行檢查。所以最好加上static和const聲明,以便讓編譯器更好的優化。

字符串常量和浮點數常量,也經常保存在靜態空間中,例如:

  1. a = b * 3.5; 
  2. c = d + 3.5; 

這里,常數3.5將存儲在靜態空間中,大多數編譯器會識別出這兩個常量是相同的,因此只需要存儲一份常量。整個程序中所有相同的常量將被連接在一起,優化程序中常量的占用空間。

寄存器存儲

寄存器是CPU中的一小塊內存,用作臨時存儲。訪問寄存器中的變量速度非常快,但是寄存器數量有限,存儲的變量也有限。編譯器優化時,會自動選擇函數中的最常用變量,存到寄存器中。程序中的局部變量就很適合于存儲在寄存器中。

寄存器數量有限,32位X86系統中,大約有6個整數寄存器用于通用目的,64位系統中有14個。而浮點變量使用不同的寄存器,32位系統中大約有8個可用的浮點寄存器,64位系統中有16個,當在64位系統中啟用更高級的指令集時,可能會有更多可用的浮點寄存器。

volatile

這里需要特別關注下volatile關鍵字,該關鍵字表示其修飾的變量可以被另一個線程更改,防止編譯器做一些過度優化。例如:

  1. volatile int seconds; 
  2.  
  3. void DelayFiveSeconds() { 
  4.     seconds = 0; 
  5. while (seconds < 5) { 
  6. // do nothing while seconds count to 5 
  7.     } 

在本例中,DelayFiveSeconds()將一直等待,直到另一個線程將seconds增加到5。

如果seconds沒被聲明為volatile,那么編譯器可能會進行過度優化,將假定在while循環中seconds保持為0,循環內的任何內容都不能更改該值。循環將是while(0 < 5){},這將是個死循環。

關鍵字volatile的作用是,確保變量永遠存儲在內存中,而不是在寄存器中,并阻止對變量的所有優化。

注意volatile不保證原子性,它不會阻止兩個線程同時嘗試寫操作。其他線程增加seconds的同時,試圖將seconds設置為0,這樣可能會失敗。更安全的做法是,一個線程只讀取seconds,并等待該值更改。

thread-local存儲

C++11中可以使用thread_local關鍵字來聲明線程本地變量,C++11前也有別的方式聲明,被修飾的變量對于每個線程都有一份拷貝,保證了線程安全。thread-local存儲效率較低,因為它是通過全局指針訪問。我們應該盡量避免線程本地存儲,可以更多將變量存儲在線程自己的棧中,即在線程自己的函數中聲明變量。

堆內存

堆內存主要通過操作符new和delete動態分配,或者使用函數malloc和free。如果以隨機的順序分配和釋放不同大小的內存,很容易產生內存碎片,分散在堆內存的不同地方,而且頻繁分配內存,開銷也較大。盡量避免動態分配內存吧,或者用JeMalloc替換一波?或內存池?

整數變量和運算

整型大小

整數中,不同類型可能會有不同的大小,下圖總結了不同整型的大小和最大最小值:

在不同的平臺,聲明特定大小整數的方法不同,我們可以使用標準頭文件stdint.h,聲明特定大小的整型,該方法還可以跨平臺,可移植。

大多數情況下,整數運算非常快,但是,如果整數大于可用寄存器大小,效率就會低一些。例如,在32位系統中,使用64位整數效率低一些,特別是用于乘法或除法時。

如果聲明了int類型,但是沒有指定具體大小,編譯器將始終選擇最有效的整數大小。較小大小的整數如char、short int等,效率可能稍微低一些,在很多情況下,編譯器在進行計算時,會將這些類型轉換為默認大小的整數,然后只使用結果中的低8位或者低16位。在64位系統中,只要我們不做除法,使用32位整數和64位整數的效率其實沒多大差別。

整數運算時,我們需要考慮中間計算的結果,看是否會導致溢出。例如表達式a=b+c+d,即使b、c、d都低于整數最大值,但是可能b+c就會導致整數溢出,我們需要時刻注意。

有符號整數和無符號整數

多數情況下,使用有符號整數和無符號整數,在速度上沒有區別,但有一些特殊情況:

常量除法,當除以常量時,無符號整數比有符號整數效率更高,模運算類似。

對于大多數指令集,使用有符號整數到浮點數的轉換,要比使用無符號整數轉換更快。

有符號和無符號整數的溢出行為不同:無符號整數的溢出產生一個低正結果,有符號整數的溢出是官方未定義的。有符號整數,正常的行為是將正溢出轉換為負值,但是編譯器可能做一些優化,它會假設不會發生溢出。

有符號整數和無符號整數之間的轉換,沒有任何開銷。這只不過是對同一符號位的不同解釋而已。負整數在轉換為無符號時,將被解釋為一個非常大的正數。

  1. int a, b; 
  2. double c; 
  3. b = (unsigned int)a / 10; // 轉換成無符號整數做除法更快 
  4. c = a * 2.5; // 有符號整數隱式轉換為double型 

在上例中,將a轉換為unsigned,可以使除法更快。當然,只有當a絕對不會是負數的時候,才可以這么轉換。最后一行,在與常數2.5相乘之前,會隱式地將a轉換為double,因為后者是double,這里a作為有符號整數去轉換,效率更高。

注意,在進行比較操作時,例如<操作,不要混用有符號整數和無符號整數。有符號整數和無符號整數的比較,可能會產生意想不到的結果。

整數運算

整數運算通常非常快。簡單的整數運算,如加法、減法、比較、位運算等,在大多數微處理器上只需要一個時鐘周期。乘法和除法需要更長的時間。整數乘法在奔騰4CPU上需要11個時鐘周期,大多數情況乘法都需要3 - 4個時鐘周期,整數除法需要40 - 80個時鐘周期,具體取決于CPU。

自增和自減運算

++i和i++速度一樣快,當僅用于遞增變量時,使用++i和i++沒有任何區別,效果完全相同,例如:

for(i=0;i

浮點數及其運算

現代x86家族的CPU,有兩種不同類型的浮點寄存器,對應不同類型的浮點指令,每種類型都有優缺點。

x87寄存器

x87寄存器是浮點運算的傳統方法,這些寄存器都有長雙精度,多個寄存器組成了一組寄存器棧,使用寄存器棧的優點有:

所有的計算都是用雙精度完成的不同精度之間的轉換不需要額外的時間。

對于數學函數,如對數函數和三角函數,有一些內置的指令。

代碼很緊湊,在代碼緩存中占用的空間很小。

寄存器棧也有缺點:

由于寄存器棧的組織方式,編譯器很難創建寄存器變量。

浮點數比較速度很慢,除非啟用更高的指令集。

當使用雙精度時,除法、平方根和數學函數,需要更多的時間來計算。

向量寄存器

也叫矢量寄存器,有XMM、YMM或ZMM等寄存器,是進行浮點運算的一種較新的方法,浮點運算以單精度或雙精度完成,中間結果的計算精度始終與操作數相同,使用向量寄存器的優點有:

  • 制作浮點寄存器變量很容易。
  • 向量操作可用于對向量寄存器中的多個變量進行并行計算。

它也有缺點:

  • 不支持長雙精度。
  • 混合不同精度的表達式計算,需要精度轉換指令,這可能非常耗時。
  • 數學函數必須使用函數庫,但這通常也比內置的硬件函數快。

在幾乎所有具有浮點運算能力的系統中,都可以使用x87浮點寄存器,而XMM、YMM和ZMM寄存器分別需要SSE、AVX和AVX512指令集。

現代編譯器,更多情況下會使用向量寄存器,來進行浮點運算。很少有編譯器可以混合兩種不同類型的浮點運算,不能為每次運算選擇最優類型。大多數情況下,當沒有使用向量運算時,單精度浮點數運算和雙精度浮點數運算速度大體相同,無論精度如何,加法、減法、乘法等運算的速度都是相同的。但如果開啟向量運算,使用XMM等向量寄存器時,單精度除法、平方根和數學函數的計算速度要比雙精度快。

如果真的對精度有高要求,可以使用雙精度浮點數,不需要太擔心速度。但如果我們可以利用好向量運算,或者有個大的浮點數數組,想要充分利用Cache,那可以考慮使用單精度浮點數。

浮點加法需要3 - 6個時鐘周期,乘法操作需要4 - 8個時鐘周期,除法需要14 - 45個時鐘周期,這取決于CPU。當使用傳統的x87浮點寄存器時,浮點數比較操作,和浮點數到整數的轉換操作,效率較低。

注意:

同一個表達式中,不要混合使用單精度和雙精度浮點數。

盡量避免整型和浮點型的轉換。

向量寄存器支持多種模式,可以根據實際需要設置不同的模式,例如flush-to-zero模式、denormals-are-zero模式等。

枚舉

枚舉其實就是個偽裝的整數,它的效率與整數相同。注意,枚舉值名字可能與一些變量或函數的名字發生沖突,可以將頭文件中的枚舉設置成較長且唯一的名字,或者放入命名空間,也可以使用enum class聲明枚舉。

布爾

布爾操作的順序優化

布爾操作符&&和||的操作數按以下方式計算。如果&&的第一個操作數為false,則根本不計算第二個操作數,因為無論第二個操作數的值是多少,結果都是false。同樣,如果||的第一個操作數為true,則不計算第二個操作數,因為結果肯定是true。

所以,我們可以將通常為true的操作數放在&&表達式的最后,或放在||表達式的最開始。例如,假設a在50%的情況下為真,b在10%的情況下為真。當a為真時,表達式a && b需要計算b,這是50%的情況。等價的表達式b && a只需要在b為真時計算a,這只占10%的時間。

如果一個操作數比另一個操作數更可預測,那么將最可預測的操作數放在前面。

如果一個操作數比另一個操作數計算得快,那么將計算得最快的操作數放在前面。

但是,在改變布爾操作數的順序必須要小心:如果操作數的計算有副作用,如果第一個操作數被用來確定第二個操作數是否有效,則不能交換操作數。例如:

  1. unsigned int i; 
  2. const int ARRAYSIZE = 100; 
  3. float list[ARRAYSIZE]; 
  4. if (i < ARRAYSIZE && list[i] > 3) {...} 

這里我們不能交換順序,因為當i>ARRAYSIZE時,list[i]操作是非法的,另一個例子:

  1. if (handle != INVALID_HANDLE_VALUE && WriteFile(handle, ...)) {...} 

同樣,這里我們也不可能交換順序。

布爾值

布爾變量被存儲為8位整數,值為0表示false, 1表示true。此種意義上,布爾變量由多種因素確定,即所有以布爾變量作為輸入的操作符,有可能不只是0和1,而以布爾變量作為輸出的操作符,只能產出0或1的值。這樣可能布爾變量作為輸入的操作效率較低。

舉例來說,對于

  1. bool a, b, c, d; 
  2. c = a && b; 
  3. d = a || b; 

而編譯器可能是這么實現的:

  1. bool a, b, c, d; 
  2. if (a != 0) { 
  3.     if (b != 0) { 
  4.         c = 1; 
  5.     } else { 
  6.         goto cfalse; 
  7.     } 
  8. else { 
  9.     cfalse: 
  10.     c = 0; 
  11. if (a == 0) { 
  12.     if (b == 0) { 
  13.         d = 0; 
  14.     } else { 
  15.         goto dtrue; 
  16.     } 
  17. else { 
  18.     dtrue: 
  19.     d = 1; 

當然,這不是最優方式。在錯誤預測的情況下,分支可能還需要很長時間。如果可以確定操作數除了0和1之外,沒有其他值,那么布爾操作的效率會高得多。編譯器沒有做這樣的假設的原因是,如果變量沒有初始化,或者來源未知,那么它們可能有其它的值。如果a和b已經初始化為有效值,或者它們來自產生布爾輸出的值,則可以優化上述代碼。優化后的代碼如下所示:

  1. char a = 0, b = 0, c, d; 
  2. c = a & b; 
  3. d = a | b; 

這里,我們可以使用char(或int)代替bool,以便能夠使用位操作符(&和|)而不是布爾操作符(&&和||)。按位操作符,是只占用一個時鐘周期的單個指令。即使a和b的值不是0或1,OR操作符(|)也可以工作。但如果操作數的值不是0和1,則AND操作符(&)和異或操作符(^)可能會產生不一致的結果。

注意這里有個坑,我們不能使用~代替!,相反,如果確定輸入是0或1,可以通過與1做異或來得到!的值。

舉例:

  1. bool a, b; 
  2. b = !a; 

可以被優化成:

  1. char a = 0, b; 
  2. b = a ^ 1; 

指針和引用

看代碼:

  1. void FuncA(int *p) { 
  2.     *p = *p + 2; 
  3. void FuncB(int &r) { 
  4.     r = r + 2; 

這兩段分別使用指針和引用的代碼,它們實際上做的是相同的事情,具體我們可以看它們編譯后生成的代碼,其實它們的匯編代碼完全相同,區別僅僅是編程風格的問題。

指針優于引用的理由是:

直接看上面的函數體,很明顯看出p是一個指針,但不清楚r是一個引用,還是一個簡單的變量,使用指針讓閱讀代碼的人更清楚地知道發生了什么。

指針的指向可以更改,使用更靈活,還可以用指針做算術運算。

引用優于指針的理由是:

引用比指針更安全,因為在大多數情況下,引用肯定指向一個有效的地址,而且引用的指向不可更改。而對于指針,如果沒有初始化,那指針算術計算超出了有效地址的范圍,或者指針類型轉換為錯誤的類型,那么指針可能是無效的,并導致致命錯誤。

引用對于復制構造函數和重載運算符很有用。

聲明為常量引用的函數形參,可接受表達式作為實參,而指針和非常量引用需要變量。

使用指針或引用訪問變量,可能與直接訪問一樣快。函數中聲明的所有非靜態變量,都存儲在棧上,實際上它們也是通過棧指針進行尋址。同樣的,類中聲明的所有非靜態變量,也是通過隱式的this指針訪問,所以,大多數變量實際上都是通過指針訪問。

使用指針或引用也有缺點,它需要一個額外的寄存器來保存指針或引用的值,而寄存器是一種稀缺資源,特別是在32位模式下。如果寄存器數量不足,那么每次使用指針時都必須從內存中加載,速度就會變慢。

注意指針這里有個坑:即指針的算數運算:

  1. struct A { 
  2.     int a; 
  3.     int b; 
  4. }; 
  5. A *a; 
  6. a = ++a; 
  7. a = ++(char*)a; 

++a和++(void*)a,它們的運算結果是不同的,++a里其實加的值是8,因為A大小是8,++(void*)a里其實加的值是1,因為(char)大小是1。

函數指針

如果目標地址可以預測,通過函數指針調用函數,相比于直接調用函數,要多花幾個時鐘周期。如果函數指針的值,與上次執行語句時相同,則目標地址會被預測成功,而如果函數指針的值發生變化,目標地址很可能會被錯誤預測,預測失敗會導致有多個時鐘周期的延遲。

智能指針

智能指針是一種行為與指針類似的對象。C++11后基本上有兩種智能指針,unique_ptr和shared_ptr,unique_ptr的特點是有且只有一個指針擁有所分配的對象,只有一個對象指針擁有對象的所有權,而shared_ptr的特點是可以有多個指針共同指向同一個對象,顯然shared_ptr比unique_ptr的開銷更大一些。選擇智能指針時可以更多的選擇unique_ptr,編譯器可以做優化,能夠在簡單情況下剝離掉unique_ptr的大部分或者全部開銷,這樣效率就和直接使用new和delete基本相同。一般一個函數內new,需要另一個函數內delete的場景下,可以考慮使用智能指針。但如果在同一個函數內new和delete,且函數體沒有過多的分支,或許就不需要使用智能指針啦。

有時候程序可能需要很多動態分配的小對象,每個對象都有自己的智能指針,這種成本是否較高?你有什么解決方案嗎?可以在留言板里留言哦!

 

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

2021-02-23 09:21:29

代碼效率C++

2012-03-31 13:51:16

IQ大戰

2013-01-21 10:02:44

2024-12-09 08:00:00

C++代碼

2022-04-13 10:39:20

濾藍光顯示器筆記本

2009-08-03 14:09:13

SAP中國真相SAP

2011-10-13 16:57:48

激光打印機常見問題

2025-02-10 07:00:00

DeepSeek服務器繁忙服務器

2011-07-11 22:19:23

激光打印機評測

2017-11-02 14:53:30

PC硬件內幕

2024-12-31 13:30:00

2011-06-28 20:34:11

打印機技巧

2012-07-16 01:20:09

代碼效率

2017-11-10 11:17:17

Facebook人際關系家庭職業

2012-03-13 09:15:34

百度

2024-12-04 09:25:00

2011-03-10 09:37:52

Facebook代碼

2025-02-19 15:12:36

2020-07-10 13:58:18

Windows 7微軟軟件
點贊
收藏

51CTO技術棧公眾號

中文字幕精品—区二区四季| 玖玖玖视频精品| 99国产精品久久久久久久久久 | 亚洲女同志亚洲女同女播放| 国产永久精品大片wwwapp| 色嗨嗨av一区二区三区| 日韩影视精品| 97人妻人人澡人人爽人人精品| 99久久婷婷这里只有精品| 91精品国产综合久久福利| 大片在线观看网站免费收看| 黄色一级a毛片| 欧美综合国产| 久久精品美女视频网站| 亚洲美女精品视频| 中文字幕资源网在线观看免费| 国产亚洲人成网站| 91在线精品播放| 三级全黄做爰视频| 国产精品色呦| 欧美日韩高清一区二区不卡| 日韩成人三级视频| 极品白浆推特女神在线观看| 久久激情综合网| 久久久久久噜噜噜久久久精品| 手机免费看av| 97视频一区| 欧美日韩一区三区| 人人妻人人做人人爽| 超碰免费97在线观看| 国产91丝袜在线播放| 国产mv免费观看入口亚洲| 小泽玛利亚一区| 国产成人手机高清在线观看网站| 欧美一级专区免费大片| 国产精品99久久免费黑人人妻| 免费av在线播放| 91网站视频在线观看| 成人国产在线视频| 中文字幕在线字幕中文| 国产精品传媒精东影业在线| 国产视频精品一区二区三区| 久久久久久国产精品日本| 偷拍中文亚洲欧美动漫| 亚洲一区二区三区四区在线免费观看| 久久精品99久久| 国产女无套免费视频| 日本亚洲三级在线| 57pao国产精品一区| 久草网站在线观看| 999精品一区| 亚洲人成在线免费观看| www.污网站| 成人黄色毛片| 欧美性猛交xxxx| 分分操这里只有精品| 激情影院在线观看| 欧美国产精品久久| 精品在线一区| 国模无码一区二区三区| 久久99国产精品免费网站| 日韩av快播网址| 久久99精品波多结衣一区| 好吊一区二区三区| 欧美精品一区在线播放| 美国一级片在线观看| 亚洲免费福利一区| 日韩av影片在线观看| 少妇熟女视频一区二区三区 | 国产suv精品一区| 日韩一二三区视频| 一本之道在线视频| 欧美精品影院| 91精品国产一区二区三区| 亚洲精品综合在线观看| 日韩成人亚洲| 欧美日本精品一区二区三区| 久久久久久久高清| 成人97精品毛片免费看| 在线综合视频播放| 久久久久亚洲av无码麻豆| 91丨精品丨国产| 日韩欧美国产电影| 亚洲一区二区三区四区av| 在线精品国产亚洲| 亚洲精品98久久久久久中文字幕| 人妻精油按摩bd高清中文字幕| 久久久国产精品入口麻豆| 日韩亚洲欧美成人一区| 中文字幕亚洲日本| 国产精品视频3p| 亚洲免费一级电影| 欧美福利第一页| 99九九热只有国产精品| 美乳少妇欧美精品| 久久精品久久国产| 亚洲综合丁香| 国产日韩换脸av一区在线观看| 免费精品一区二区| 久久99久久99精品免视看婷婷| 成人福利视频网| 亚洲高清在线观看视频| av在线播放不卡| 久久影院理伦片| 3p在线观看| 亚洲精品ww久久久久久p站| 欧美在线观看视频免费| 性感女国产在线| 欧美日韩高清一区二区不卡| 少妇欧美激情一区二区三区| 欧美理论电影在线精品| 在线播放国产一区中文字幕剧情欧美| 欧美特黄一级片| 亚洲免费成人| 国产欧美一区二区白浆黑人| 亚洲黄色精品视频| 久久久亚洲午夜电影| 中文字幕一区二区三区乱码| 成人影院在线视频| 欧美性受极品xxxx喷水| 久久6精品影院| 中文字幕无码日韩专区免费 | 国产精品三级在线观看| 亚洲国产美女精品久久久久∴| 亚洲の无码国产の无码步美| 精品国产中文字幕第一页| 六月婷婷色综合| 亚洲综合中文字幕在线| 理论片中文字幕| 国产亲近乱来精品视频| 成年在线观看视频| 日日夜夜天天综合| 精品国产髙清在线看国产毛片| 日本xxxxxxxxx18| 国内自拍一区| 欧美中文字幕在线播放| 国产精品久久久久毛片| 91网站在线播放| 99精品一区二区三区的区别| 国产精品专区免费| 欧美成人性战久久| 国产无遮挡在线观看| 在线综合视频| 3d动漫啪啪精品一区二区免费| 二人午夜免费观看在线视频| 黑人巨大精品欧美一区二区一视频| 爽爽爽在线观看| 成人免费a**址| 69精品小视频| 性生活免费网站| 亚洲视频一二区| 一级在线免费视频| 亚洲人和日本人hd| 97香蕉超级碰碰久久免费的优势| 欧美成人精品网站| 91蝌蚪国产九色| 久艹视频在线免费观看| 日韩成人久久| 色妞在线综合亚洲欧美| 久草免费新视频| 国产麻豆欧美日韩一区| 精品一区二区成人免费视频| 久久天天久久| 亚洲欧美在线x视频| 国产精品第108页| 成人免费视频视频| 日韩精品一区二区在线视频| 国产精品99| 亚洲人成电影在线观看天堂色| 国产综合精品视频| 久久久久亚洲综合| 欧美 激情 在线| 粉嫩av一区二区| 久久久人成影片一区二区三区观看 | 青青国产在线观看| 不卡高清视频专区| 高清欧美精品xxxxx| 精品国产乱子伦一区二区| 欧美极品第一页| 欧美一区二区三区黄片| 亚洲一区精品在线| 亚洲啪av永久无码精品放毛片| 一区二区亚洲精品| 狠狠色综合网站久久久久久久| 成人影音在线| 日韩大陆毛片av| 亚洲 欧美 日韩 在线| 久久久久久久久久久黄色| 丰满少妇被猛烈进入高清播放| 免费精品国产| 成人久久一区二区| 欧洲在线视频| 日韩精品极品视频| 无码人妻精品一区二区50| 国产欧美精品区一区二区三区 | 午夜激情一区| 国产在线精品一区二区三区| 欧美成人性网| 久久视频免费在线播放| 性一交一乱一精一晶| 亚洲不卡av一区二区三区| theav精尽人亡av| 蜜臀久久久久久久| 国产日韩欧美大片| 欧美日韩看看2015永久免费| 日韩av理论片| 在线中文字幕第一页| 亚洲激情小视频| 一级aaaa毛片| 亚洲欧美另类图片小说| 亚洲av无码一区二区三区网址| 日本在线观看不卡视频| 久久观看最新视频| 免费观看成人www动漫视频| 日韩美女主播视频| 超碰在线caoporn| 日韩电影网在线| 国产精品热久久| 色一情一伦一子一伦一区| 亚洲一级二级片| 久久色在线观看| 性xxxxxxxxx| 日本午夜一区二区| 男女视频网站在线观看| 青青草91久久久久久久久| 国产精品美女黄网| 国产精品久久久久久妇女| 高清一区二区三区日本久| 高清性色生活片在线观看| 日韩精品一区二区在线| 999视频在线| 国产精品福利一区| aaaaa一级片| 高清视频一区二区| 欧美特黄aaa| 天使萌一区二区三区免费观看| av久久久久久| 欧美电影一区| 欧美日韩国产综合在线| 8x国产一区二区三区精品推荐| 国产综合福利在线| 香蕉伊大人中文在线观看| 久久99精品久久久久久琪琪| 亚洲精品承认| 中文字幕亚洲欧美日韩在线不卡| 天堂中文在线8| 亚洲黄色av网站| www.色呦呦| 欧美精品免费视频| 国产字幕在线观看| 五月天网站亚洲| 久久精品国产亚洲av麻豆色欲 | 黄色片视频网站| 一区二区三区精品在线| 青青操在线视频观看| 欧美国产一区在线| 久久中文字幕精品| 国产亚洲成aⅴ人片在线观看| 鲁大师私人影院在线观看| 成人小视频在线| 在线观看免费视频黄| 国产成人综合在线观看| 欧美激情第四页| 国产传媒欧美日韩成人| 在线观看亚洲免费视频| 91在线小视频| 免费视频91蜜桃| 亚洲少妇最新在线视频| 久久国产在线观看| 欧美日韩国产精品一区二区三区四区 | 久久美女免费视频| 欧美国产精品一区二区三区| 久久av红桃一区二区禁漫| 亚洲黄色性网站| 色婷婷av国产精品| 欧美视频精品在线| av免费在线观看不卡| 亚洲第一精品福利| 国产日本在线观看| 免费不卡欧美自拍视频| 黄视频网站在线观看| 国产成人在线播放| 欧美第一在线视频| 久久视频在线观看中文字幕| 日本一二区不卡| av网站手机在线观看| 久久国产高清| 少妇性l交大片7724com| 91免费观看视频在线| 日本裸体美女视频| 午夜精品一区二区三区免费视频| 波多野结衣影片| 精品成人佐山爱一区二区| 国产在线黄色| 欧美第一淫aaasss性| 少妇一区视频| 粉嫩高清一区二区三区精品视频 | 最近2019中文免费高清视频观看www99| 国产在线69| 日本高清+成人网在线观看| 高清不卡一区| 欧美精品一区二区三区久久| 一二三区不卡| 久久久久久三级| gogogo免费视频观看亚洲一| 婷婷丁香综合网| 欧美日韩另类在线| 国产sm主人调教女m视频| 日韩久久免费视频| 国产高清在线观看免费不卡| 一区二区三区四区在线视频| 黄色日韩在线| www.污污视频| 国产丝袜在线精品| 日韩欧美高清在线观看| 777xxx欧美| av基地在线| 人人爽久久涩噜噜噜网站| 亚洲精品一区二区三区在线| 亚洲精品国产精品国自产| 亚洲激情欧美| 韩国三级丰满少妇高潮| 日本一区二区久久| 好看的av在线| 精品av综合导航| 91在线中文| 国产日韩欧美自拍| 精品国产一区二区三区小蝌蚪| 无码人妻丰满熟妇区96| 国产福利91精品一区二区三区| 韩国一级黄色录像| 欧美在线看片a免费观看| 天堂网2014av| 久久欧美在线电影| 少妇精品在线| 精品一区二区三区毛片| 久久99蜜桃精品| 国产3级在线观看| 欧美日韩国产综合一区二区| 国产视频精选在线| 青草热久免费精品视频 | 视频在线观看91| 在线观看国产三级| 亚洲第一久久影院| 国产综合在线播放| 97国产一区二区精品久久呦| 福利电影一区| 18禁免费观看网站| 91亚洲男人天堂| 日日摸天天添天天添破| 日韩电影中文字幕在线| 性欧美又大又长又硬| 欧美日韩在线精品| 日韩高清一区在线| 林心如三级全黄裸体| 欧美揉bbbbb揉bbbbb| 午夜小视频在线| 亚洲一区二区少妇| 韩日成人在线| www国产视频| 天天综合天天综合色| 亚洲日本中文字幕在线| 人人爽久久涩噜噜噜网站| 精品午夜久久| 亚洲精品成人在线播放| 一区二区三区中文字幕电影| 欧美 日韩 国产 成人 在线| 午夜精品在线视频| 蜜桃国内精品久久久久软件9| 天堂av在线网站| 亚洲免费av高清| 日韩一区二区三区不卡| 国产成人极品视频| 欧美va久久久噜噜噜久久| 97人人模人人爽人人澡| 天天操天天综合网| 狠狠狠综合7777久夜色撩人| 国产精品色午夜在线观看| 亚洲精品一二三区区别| 国产国语老龄妇女a片| 欧美性猛交xxx| 动漫一区在线| 鲁丝片一区二区三区| 美国一区二区三区在线播放| 国产免费无码一区二区视频| 日韩精品视频免费| 亚洲狼人在线| 国产超级av在线| 综合中文字幕亚洲| 少妇高潮一区二区三区99小说| 国产精品99久久久久久久久 | 午夜精品影视国产一区在线麻豆| 三级a在线观看| 亚洲自拍偷拍av| 成人午夜影视| 国产在线一区二区三区四区| 奇米色777欧美一区二区| 香蕉视频一区二区| 日韩在线视频二区| 亚洲人成网www|