青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

洛譯小筑

別來無恙,我的老友…
隨筆 - 45, 文章 - 0, 評論 - 172, 引用 - 0
數(shù)據(jù)加載中……

[ECPP讀書筆記 條目30] 深入探究內(nèi)聯(lián)函數(shù)

內(nèi)聯(lián)函數(shù)——多么振奮人心的一項(xiàng)發(fā)明!它們看上去與函數(shù)很相像,它們擁有與函數(shù)類似的行為,它們要比宏(參見條目2)好用的多,同時(shí)你在調(diào)用它們時(shí)帶來的開銷比一般函數(shù)小得多。可謂“內(nèi)聯(lián)在手,別無他求。”

你得到的遠(yuǎn)遠(yuǎn)比你想象的要多,因?yàn)楣?jié)約函數(shù)調(diào)用的開銷僅僅是冰山一角。我們知道編譯器優(yōu)化通常是針對那些沒有函數(shù)調(diào)用的代碼,因此當(dāng)你編寫內(nèi)聯(lián)函數(shù)時(shí),編譯器就會(huì)針對函數(shù)體的上下文進(jìn)行優(yōu)化工作。大多數(shù)編譯器都不會(huì)針對“外聯(lián)”函數(shù)調(diào)用進(jìn)行這樣的優(yōu)化。

然而,在你的編程生涯中,“沒有免費(fèi)的午餐”這句生活哲言同樣奏效,內(nèi)聯(lián)函數(shù)也沒有例外。內(nèi)聯(lián)函數(shù)背后蘊(yùn)含的理念是:用代碼本體來取代每次函數(shù)調(diào)用,這樣做很可能會(huì)使目標(biāo)代碼的體積增大不少,這一點(diǎn)并不是非要統(tǒng)計(jì)學(xué)博士才能看得清。對于內(nèi)存空間有限的機(jī)器而言,過分熱衷于使用內(nèi)聯(lián)則會(huì)造成過多的空間占用。即使在虛擬內(nèi)存中,那些冗余的內(nèi)聯(lián)代碼也會(huì)帶來不少無謂的分頁,從而使緩存讀取命中率降低,最終帶來性能的犧牲。

另一方面,如果一個(gè)內(nèi)聯(lián)函數(shù)體非常的短,那么為函數(shù)體所生成代碼的體積則可能會(huì)比調(diào)用函數(shù)所生成的代碼小一些。此時(shí),內(nèi)聯(lián)函數(shù)才真正做到了減小目標(biāo)代碼和提高緩存讀取命中率的目的。

請時(shí)刻牢記,Inline是對編譯器的一次請求,而不是一條命令。這種請求可以顯式提出也可以隱式提出。隱式請求的途徑就是:在類定義的內(nèi)部定義函數(shù):

class Person {

public:

  ...

  int age() const { return theAge; }    // 隱式內(nèi)聯(lián)請求:

  ...                                   // 年齡age在類定義中做出定義

 

private:

  int theAge;

};

這樣的函數(shù)通常是成員函數(shù),但是類中定義的函數(shù)也可以是友元(參見條目46),如果函數(shù)是友元,那么它們會(huì)被隱式定義為內(nèi)聯(lián)函數(shù)。

顯式聲明內(nèi)聯(lián)函數(shù)的方法為:在函數(shù)定義之前添加inline關(guān)鍵字。比如說,下面是標(biāo)準(zhǔn)max模板(來自<algorithm>)常見的定義方式:

template<typename T>               // 顯式內(nèi)聯(lián)請求:

inline const T& std::max(const T& a, const T& b)

{ return a < b ? b : a; }         // std::max的前邊添加”inline”

max是模板”這一事實(shí),讓我們不免得出這樣的推論:內(nèi)聯(lián)函數(shù)和模板都應(yīng)該定義在頭文件中。這就使一些程序員做出“函數(shù)模板必須是內(nèi)聯(lián)函數(shù)”的論斷。這一結(jié)論不僅站不住腳,而且也存在潛在的害處,所以這里還是要稍稍深入了解一下。

由于大多數(shù)編程環(huán)境的內(nèi)聯(lián)操作都是在編譯過程中進(jìn)行的,因此內(nèi)聯(lián)函數(shù)一般都應(yīng)該定義在頭文件中。編譯器必須首先了解函數(shù)的情況,以便于用所調(diào)用函數(shù)體來代替這次函數(shù)調(diào)用。(一些構(gòu)建環(huán)境在連接過程中進(jìn)行內(nèi)聯(lián),還有個(gè)別基于.NET通用語言基礎(chǔ)結(jié)構(gòu)(CLI)的環(huán)境甚至是在運(yùn)行時(shí)進(jìn)行內(nèi)聯(lián)。這樣的環(huán)境屬于例外,不是守則。在大多數(shù)C++程序中,內(nèi)聯(lián)是一個(gè)編譯時(shí)行為。)

模板通常保存在頭文件中,這是因?yàn)榫幾g器需要了解這些模板,以便于在使用時(shí)進(jìn)行正確的實(shí)例化。(再次說明,這并不是一成不變的。一些編程環(huán)境在連接時(shí)進(jìn)行模板實(shí)例化。但是編譯時(shí)實(shí)例化是更通用的方式。)

模板實(shí)例化相對于內(nèi)聯(lián)是獨(dú)立的。如果你正在編寫一個(gè)模板,而你又確信由這個(gè)模板所實(shí)例化出的所有函數(shù)都應(yīng)該是內(nèi)聯(lián)的,那么這個(gè)模板就應(yīng)該添加inline關(guān)鍵字;這也就是上文中std::max實(shí)現(xiàn)的做法。但是如果你正在編寫的模板并不需要內(nèi)聯(lián)函數(shù),那么就不要聲明內(nèi)聯(lián)模板(無論是顯式還是隱式)。內(nèi)聯(lián)也是有開銷的,不計(jì)成本的引入內(nèi)聯(lián)并不明智。我們已經(jīng)介紹過內(nèi)聯(lián)是如何使代碼膨脹起來的(對于模板的作者而言,還應(yīng)該做更周密的考慮——參見條目44),但是內(nèi)聯(lián)還會(huì)帶來其他的開銷,這就是我們即將討論的問題。

inline是對編譯器的一次請求,但編譯器可能會(huì)忽略它。”在我們的討論開始之前,我們首先要弄清這一點(diǎn)。大多數(shù)編譯器如果認(rèn)為當(dāng)前的函數(shù)過于復(fù)雜(比如包含循環(huán)或遞歸的函數(shù)),或者這個(gè)函數(shù)是虛函數(shù)(即使是最平常的虛函數(shù)調(diào)用),就會(huì)拒絕將其內(nèi)聯(lián)。后一個(gè)結(jié)論很好理解。因?yàn)?span style="font-family:"Courier New";">virtual意味著“等到運(yùn)行時(shí)再指出要調(diào)用哪個(gè)程序,”而inline意味著“在執(zhí)行程序之前,使用要調(diào)用的函數(shù)來代替這次調(diào)用。”如果編譯器不知道要調(diào)用哪個(gè)函數(shù),那么它們拒絕內(nèi)聯(lián)函數(shù)體的做法就無可厚非了。

綜上所述,我們得出下面的結(jié)論:一個(gè)給定的內(nèi)聯(lián)函數(shù)是否真正的得到內(nèi)聯(lián),取決于你正在使用的構(gòu)建環(huán)境——主要是編譯器。幸運(yùn)的是,大多數(shù)編譯器擁有診斷機(jī)制,如果在內(nèi)聯(lián)某個(gè)函數(shù)時(shí)失敗了,那么編譯器將會(huì)做出警告(參見條目53)。

有些時(shí)候,即使編譯器認(rèn)為某個(gè)函數(shù)非常適合內(nèi)聯(lián),可是還是會(huì)為它生成一個(gè)函數(shù)體。舉例說,如果你的程序要取得某個(gè)內(nèi)聯(lián)函數(shù)的地址,那么一般情況下編譯器必須為其創(chuàng)建一個(gè)外聯(lián)的函數(shù)體。編譯器怎么能讓一個(gè)指針去指向一個(gè)不存在的函數(shù)呢?再加上“編譯器一般不會(huì)通過對函數(shù)指針的調(diào)用進(jìn)行內(nèi)聯(lián)”這一事實(shí),更能肯定這一結(jié)論:對于一個(gè)內(nèi)聯(lián)函數(shù)的調(diào)用是否應(yīng)該得到內(nèi)聯(lián),取決于這一調(diào)用是如何進(jìn)行的:

inline void f() {...}              // 假設(shè)編譯器樂意于將f的調(diào)用進(jìn)行內(nèi)聯(lián)

void (*pf)() = f;                  // pf指向f

...

f();                               // 此調(diào)用將被內(nèi)聯(lián),因?yàn)檫@是一次“正常”的調(diào)用

 

pf();                              // 此調(diào)用很可能不會(huì)被內(nèi)聯(lián),

                                   // 因?yàn)樗峭ㄟ^一個(gè)函數(shù)指針進(jìn)行的

即使你從未使用函數(shù)指針,未得到內(nèi)聯(lián)處理的內(nèi)聯(lián)函數(shù)依然會(huì)“陰魂不散”,這是因?yàn)檎{(diào)用函數(shù)指針的不僅僅是程序員。在對數(shù)組內(nèi)的對象進(jìn)行構(gòu)造或析構(gòu)的過程中,編譯器有時(shí)會(huì)生成構(gòu)造函數(shù)和析構(gòu)函數(shù)的不恰當(dāng)?shù)陌姹荆瑥亩顾鼈兛梢缘玫竭@些函數(shù)的指針以便使用。

實(shí)際上,為構(gòu)造函數(shù)和析構(gòu)函數(shù)進(jìn)行內(nèi)聯(lián)通常不是一個(gè)最佳選擇。請看下面示例中Derived類的構(gòu)造函數(shù):

class Base {

public:

 ...

private:

   std::string bm1, bm2;           // 基類成員12

};

 

class Derived: public Base {

public:

  Derived() {}                     // 派生類的構(gòu)造函數(shù)為空還有別的可能?

  ...

private:

  std::string dm1, dm2, dm3;       // 派生類成員 1–3

};

乍看上去,將這個(gè)構(gòu)造函數(shù)進(jìn)行內(nèi)聯(lián)再適合不過了,因?yàn)樗话魏未a。但是你的眼睛欺騙了你。

C++對于在創(chuàng)建和銷毀對象的過程中發(fā)生的事件進(jìn)行了多方面的保證。比如,當(dāng)你使用new時(shí),你動(dòng)態(tài)創(chuàng)建的對象就會(huì)通過構(gòu)造函數(shù)將其自動(dòng)初始化;當(dāng)你使用delete時(shí),將調(diào)用相關(guān)的析構(gòu)函數(shù)。當(dāng)你創(chuàng)建一個(gè)對象時(shí),該對象的所有基類和所有數(shù)據(jù)成員將自動(dòng)得到構(gòu)造,在銷毀這個(gè)對象時(shí),相關(guān)的析構(gòu)過程將會(huì)以反方向自動(dòng)進(jìn)行。如果在對象的構(gòu)造過程中有異常拋出,那么對象中已經(jīng)得到構(gòu)造的部分將統(tǒng)統(tǒng)被自動(dòng)銷毀。在所有這些場景中,C++告訴你什么一定會(huì)發(fā)生,但它沒有說明如何發(fā)生。這一點(diǎn)取決于編譯器的實(shí)現(xiàn)者,但是必須要清楚的一點(diǎn)是,這些事情并不是自發(fā)的。你必須要在程序中添加一些代碼來實(shí)現(xiàn)它們。這些代碼一定存在于某處,它們由編譯器代勞,在編譯過程中插入你的程序中。一些時(shí)候它們就存在于構(gòu)造函數(shù)和析構(gòu)函數(shù)中,所以,上文中Derived構(gòu)造函數(shù)雖然看似是空的,但我們可以想象其與以下的具體實(shí)現(xiàn)中生成的代碼是等價(jià)的:

Derived::Derived()                    // Derived“空”構(gòu)造函數(shù)實(shí)現(xiàn):概念版

{

 Base::Base();                        // 初始化Base部分

 

 try { dm1.std::string::string(); }   // 嘗試構(gòu)造dm1

 catch (...) {                        // 如果拋出異常,

   Base::~Base();                     // 銷毀基類部分,

   throw;                             // 并且傳播該異常

 }

 

 try { dm2.std::string::string(); }   // 嘗試構(gòu)造dm2

 catch(...) {                         // 如果拋出異常,

   dm1.std::string::~string();        // 銷毀dm1,

   Base::~Base();                     // 銷毀基類部分,

   throw;                             // 并且傳播該異常

 }

 

 try { dm3.std::string::string(); }   // 嘗試構(gòu)造dm3

 catch(...) {                         // 如果拋出異常,

   dm2.std::string::~string();        // 銷毀dm2,

   dm1.std::string::~string();        // 銷毀dm1,

   Base::~Base();                     // 銷毀基類部分,

   throw;                             // 并且傳播該異常

 }

}

這段代碼并不能完全反映出真實(shí)的編譯器所做的事情,因?yàn)檎鎸?shí)的編譯器采用的做法更加精密。然而,上面的代碼可以精確地反映出Derived的“空”構(gòu)造函數(shù)必須提供的內(nèi)容。無論編譯器處理異常的實(shí)現(xiàn)方式多么精密,Derived的構(gòu)造函數(shù)必須至少為其數(shù)據(jù)成員和基類調(diào)用構(gòu)造函數(shù),這些調(diào)用(可能就是內(nèi)聯(lián)的)會(huì)使Derived顯得不那么適合進(jìn)行內(nèi)聯(lián)。

這一推理過程對于Base的構(gòu)造函數(shù)同樣適用,因此如果將Base內(nèi)聯(lián),所有添加進(jìn)其中的代碼同樣也會(huì)添加進(jìn)Derived的構(gòu)造函數(shù)中(通過Derived構(gòu)造函數(shù)調(diào)用Base構(gòu)造函數(shù)的過程)。同時(shí),如果string的構(gòu)造函數(shù)恰巧是內(nèi)聯(lián)的,那么Derived的構(gòu)造函數(shù)將為其復(fù)制出五份副本,分別對應(yīng)Derived對象中包含的五個(gè)字符串(兩個(gè)繼承而來,另外三個(gè)系對象本身包括)。至于為什么“Derived的構(gòu)造函數(shù)是否該內(nèi)聯(lián)須深思熟慮”,現(xiàn)在可能就很容易理解了。對于Derived的析構(gòu)函數(shù)也一樣,無論如何,由Derived的構(gòu)造函數(shù)所初始化的所有對象必須全部恰當(dāng)?shù)牡玫戒N毀。

庫設(shè)計(jì)者必須估算出將函數(shù)內(nèi)聯(lián)所帶來的影響,因?yàn)槟銦o法為庫中的客戶可見的內(nèi)聯(lián)函數(shù)提供目標(biāo)代碼級別的升級。換句話說,如果f是庫中的一個(gè)內(nèi)聯(lián)函數(shù),那么庫的客戶就會(huì)將f的函數(shù)體編譯進(jìn)他們的程序中。如果一個(gè)庫實(shí)現(xiàn)者在后期修改了f的內(nèi)容,那么所有曾經(jīng)使用過f的客戶必須要重新編譯。這一點(diǎn)是我們所不希望看到的。另一個(gè)角度講,如果f不是內(nèi)聯(lián)函數(shù),那么修改f只需要客戶重新連接一下就可以了。這樣要比重新編譯減少很多繁雜的工作,并且,如果庫中需要使用的函數(shù)是動(dòng)態(tài)鏈接的,那么它對于客戶就是完全透明的。

從開發(fā)優(yōu)質(zhì)程序的角度講,這些重要問題應(yīng)時(shí)刻牢記。但是以編寫代碼實(shí)際操作的角度來說,這一個(gè)事實(shí)將淹沒一切:大多數(shù)調(diào)試人員面對內(nèi)聯(lián)函數(shù)時(shí)會(huì)遇到麻煩。這并不會(huì)令人意外,你如何為一個(gè)不存在的函數(shù)設(shè)定一個(gè)跟蹤點(diǎn)呢?盡管一些構(gòu)建環(huán)境提供了內(nèi)聯(lián)函數(shù)調(diào)試的支持,但是大多數(shù)環(huán)境都在調(diào)試過程中直接禁止內(nèi)聯(lián)。

對于“哪個(gè)函數(shù)應(yīng)該聲明為inline而哪些不應(yīng)該”這一問題,我們可以由上文中引出一個(gè)邏輯上的策略。起初,不要內(nèi)聯(lián)任何內(nèi)容,或者僅挑選出那些不得不內(nèi)聯(lián)的函數(shù)(參見條目46)或者那些確實(shí)是很細(xì)小的程序(比如本節(jié)開篇處出現(xiàn)的Person::age)進(jìn)行內(nèi)聯(lián)。謹(jǐn)慎引入內(nèi)聯(lián),你就為調(diào)試工作提供了方便,但是你仍然要為內(nèi)聯(lián)擺正位置:它屬于手工的優(yōu)化操作。不要忘記80-20經(jīng)驗(yàn)決定主義原則:一個(gè)典型的程序?qū)⒒ㄈ?0%的時(shí)間僅僅運(yùn)行20%的代碼。這是一個(gè)非常重要的原則,因?yàn)樗嵝阎覀冘浖_發(fā)者的目標(biāo):找出你的代碼中20%的這部分進(jìn)行優(yōu)化,從而從整體上提高程序的性能。你可以花費(fèi)漫長的時(shí)間進(jìn)行內(nèi)聯(lián)、修改函數(shù)等等,但如果你沒有鎖定正確的目標(biāo),那么你做再多的努力也是徒勞。

時(shí)刻牢記

僅僅對小型的、調(diào)用頻率高的程序進(jìn)行內(nèi)聯(lián)。這將簡化你的調(diào)試操作,提供更靈活的目標(biāo)代碼可更新性,降低潛在的代碼膨脹發(fā)生的可能,并且可以讓程序獲得更高的速度。

不要將模板聲明為inline的,因?yàn)樗鼈円话阍陬^文件中出現(xiàn)。

posted on 2007-11-18 23:27 ★ROY★ 閱讀(1620) 評論(1)  編輯 收藏 引用 所屬分類: Effective C++

評論

# re: 【讀書筆記】[Effective C++第3版][第30條] 深入探究內(nèi)聯(lián)函數(shù)  回復(fù)  更多評論   

我怎么看ACE的源碼里這么多宏,他還是高性能框架呢
2007-11-19 21:22 | evoup
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲免费观看高清完整版在线观看熊| 国产日韩精品综合网站| 亚洲人成网站在线播| 亚洲国产欧美一区二区三区久久| 一区二区三区欧美激情| 国产美女精品| 久热re这里精品视频在线6| 久久久久久自在自线| 国产一区二区三区在线观看网站| 欧美专区一区二区三区| 久久精品免费观看| 日韩午夜在线| 亚洲欧美久久久久一区二区三区| 国产日韩欧美二区| 亚洲国产欧美一区二区三区同亚洲| 欧美三级视频| 欧美日韩一二三区| 亚洲网站在线播放| 久久一区欧美| 亚洲免费婷婷| 欧美v日韩v国产v| 久久久国产精品一区二区中文 | 蜜桃av一区| 亚洲一区综合| 欧美日韩亚洲一区| 久久综合导航| 国产精品美女黄网| 亚洲小说春色综合另类电影| 亚洲日本电影在线| 久久久精品五月天| 久久人人爽人人爽爽久久| 欧美一级免费视频| 一本大道久久a久久精品综合| 久久狠狠婷婷| 美女主播一区| 亚洲第一在线综合网站| 欧美在线播放一区二区| 久久亚洲不卡| 尤物yw午夜国产精品视频| 羞羞漫画18久久大片| 欧美一区二区在线免费观看| 国产精品亚洲美女av网站| 日韩亚洲不卡在线| 欧美在线播放视频| 精品91免费| 欧美日韩国产va另类| 一本色道久久综合亚洲91| 欧美在线影院| 欧美xxx成人| 在线精品国产成人综合| 欧美三级视频在线| 狂野欧美一区| 国产亚洲欧美一区二区三区| 中文欧美在线视频| 老牛嫩草一区二区三区日本| 日韩性生活视频| 国内成人精品一区| 欧美三级在线| 欧美另类一区| 欧美不卡视频一区发布| 久久琪琪电影院| 亚洲欧美日韩国产| 日韩视频亚洲视频| 久久久久国产一区二区三区四区| 亚洲福利国产精品| 国产精品色婷婷| 欧美日韩精品系列| 久久久99免费视频| 欧美一级电影久久| 亚洲欧美日韩精品久久奇米色影视| 久久阴道视频| 免费在线国产精品| 欧美成人免费在线视频| 欧美成人国产一区二区| 亚洲欧洲综合| 日韩视频一区二区三区在线播放| 亚洲激情小视频| 欧美aⅴ一区二区三区视频| 久久国产66| 免费欧美高清视频| 欧美激情第8页| 欧美国产高潮xxxx1819| 欧美成人日本| 亚洲精品日韩在线观看| 亚洲一区国产一区| 欧美一区视频| 欧美四级电影网站| 国户精品久久久久久久久久久不卡 | 在线观看中文字幕不卡| 国产一区日韩一区| 亚洲美女91| 亚洲一区二区视频在线| 欧美大色视频| 国产一区激情| 在线观看亚洲视频| 在线性视频日韩欧美| 欧美一区二区三区久久精品茉莉花| 久久午夜电影网| 亚洲一二三区在线观看| 免费久久99精品国产| 国产精品久久久久毛片软件| 99热精品在线观看| 亚洲国产合集| 久久美女性网| 国产精品专区第二| 欧美一区二区三区免费在线看| 欧美激情第8页| 欧美激情视频一区二区三区免费 | 亚洲巨乳在线| 欧美91精品| 久久久九九九九| 精品91久久久久| 久久综合伊人77777尤物| 欧美伊人久久大香线蕉综合69| 欧美高清成人| 99精品视频免费观看视频| 欧美一区激情| 欧美暴力喷水在线| 久久午夜精品一区二区| 在线观看一区二区精品视频| 久久精品噜噜噜成人av农村| 久久不射2019中文字幕| 伊人一区二区三区久久精品| 久久国产精品网站| 亚洲欧美日韩第一区| 狠狠色狠狠色综合| 一区二区欧美在线| 一区二区三区自拍| 一区二区三区高清视频在线观看| 国产精品www.| 欧美激情国产日韩精品一区18| 久久久久国产精品人| 欧美大片第1页| 久久久精品国产免费观看同学| 欧美韩日一区二区| 久久国产精品久久w女人spa| 欧美精品入口| 欧美xxxx在线观看| 国产视频久久久久| 正在播放欧美视频| 亚洲午夜伦理| 国产精品福利影院| 日韩天堂av| 一本色道婷婷久久欧美| 免费日韩av| 亚洲国产欧美一区| 亚洲欧洲日韩女同| 美女网站久久| 欧美激情精品久久久久久免费印度| 欧美日韩亚洲综合一区| 亚洲国产经典视频| 韩国v欧美v日本v亚洲v| 欧美一区三区二区在线观看| 久久免费视频这里只有精品| 国产有码一区二区| 久久精品首页| 欧美国产欧美亚洲国产日韩mv天天看完整 | 麻豆精品91| 亚洲免费大片| 国产欧美日韩在线播放| 久久se精品一区二区| 亚洲大胆av| 中文精品视频| 欧美一区二区三区免费观看视频| 伊人久久婷婷色综合98网| 久久综合狠狠综合久久激情| 亚洲激情自拍| 性亚洲最疯狂xxxx高清| 激情欧美国产欧美| 欧美精品国产一区二区| 99riav久久精品riav| 亚洲一区制服诱惑| 在线日本成人| 国产三级欧美三级日产三级99| 欧美成人午夜77777| 久久国产精品一区二区| 一区二区精品国产| 欧美福利小视频| 欧美久久久久久| 麻豆av福利av久久av| 久久精品一区蜜桃臀影院 | 久久精品视频在线播放| 亚洲视频欧美视频| 亚洲久久一区| 宅男精品视频| 亚洲狼人综合| 一本一道久久综合狠狠老精东影业| 免费看黄裸体一级大秀欧美| 久久久久一区二区| 蜜桃av综合| 亚洲久久视频| 亚洲午夜电影网| 欧美在线观看天堂一区二区三区| 亚洲一级在线观看| 久久久久综合网| 国产精品va在线播放我和闺蜜| 国产精品欧美在线| 国内精品写真在线观看| 亚洲第一成人在线| 日韩一级精品|