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

天秤座的唐風(fēng)

總會(huì)有一個(gè)人需要你的分享~!- 唐風(fēng) -

  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  13 隨筆 :: 0 文章 :: 69 評(píng)論 :: 0 Trackbacks

與臨時(shí)對(duì)象的斗爭(zhēng)(下)

作者:唐風(fēng)

原載:www.cnblos.com/liyiwen

上篇里,我們看到了 (N)RVO 和右值引用,下面我們來(lái)看看表達(dá)式模板。

Expression Template(表達(dá)式模板,ET)

如果有“系統(tǒng)地”學(xué)習(xí)過(guò) C++ 的模板編程,那么你應(yīng)該已經(jīng)知道 Expression Template 這個(gè)“東西”。在模板圣經(jīng)《C++ templates》的第 18 章專門用了一整章來(lái)講這個(gè)技巧,(是的,我認(rèn)為它是一種技巧)。足以見(jiàn)得它比較復(fù)雜,也很重要。

說(shuō)起 Expression Template 產(chǎn)生,“臨時(shí)對(duì)象”也是“功臣”之一啊。還是來(lái)用例子來(lái)說(shuō)明(你能很容易找到這樣類似的例子,呵,我就是參照著別人寫的):

class MyVec
{
public:
    MyVec(){
        p = new int[SIZE];
    }
    MyVec(MyVec const& a_left) {
        p = new int[SIZE];
        memcpy(p, a_left.p, SIZE * sizeof(int));
    }
    ~MyVec(){delete [] p;}
    MyVec& operator=(MyVec const& a_left) {
        if (this != &a_left) {
            delete [] p;
            p = new int[SIZE];
            memcpy(p, a_left.p, SIZE * sizeof(int));
        }
        return *this;
    }
    int& operator [](size_t a_idx) { 
        return p[a_idx];
    }
    int operator [](size_t a_idx)const { 
        return p[a_idx];
    }
    MyVec const operator + (MyVec const& a_left) const {
        MyVec temp(*this);
        temp += a_left;
        return temp;
    }
    MyVec& operator += (MyVec const& a_left) { 
        for (size_t i = 0; i < SIZE; ++i) {
            p[i] += a_left.p[i];
        }
        return *this;
    }
private:
    static int const SIZE = 100;
    int* p;
};

int main(int argc, char* argv[])
{
    MyVec a, b, c;
    MyVec d = a + b + c;
    return 0;
}

看,我們寫下這么小段代碼:

MyVec d = a + b + c;

這是很常用的數(shù)學(xué)運(yùn)算吧,而且代碼很直觀。但這個(gè)表達(dá)式有一個(gè)問(wèn)題,就是產(chǎn)生了“不必要”的臨時(shí)對(duì)象。因?yàn)?a + b 的結(jié)果會(huì)成為一個(gè)存在一個(gè)臨時(shí)對(duì)象上 temp 上,然后這個(gè) temp 再加上 c ,最后把結(jié)果傳給 d 進(jìn)行初始化。如果這些向量很長(zhǎng),或是表達(dá)式再加幾節(jié),可以想像這些 temp 會(huì)多讓人不爽。

而且,如果我們寫成這樣:

MyVec d = a;
d += b;
d += c;

就可以避免產(chǎn)生多余的臨時(shí)對(duì)象。但這樣寫,如果是不了解“行情”的人看了MyVec d = a + b + c;之后再看這段,是不是會(huì)覺(jué)得寫這代碼的人欠K?

好吧,你會(huì)問(wèn),上面不是說(shuō)右值引用可以解決這樣問(wèn)題?是的,但在沒(méi)有右值引用的“黑暗日子”里,我們就不用過(guò)活了?當(dāng)然要,小學(xué)開(kāi)始數(shù)學(xué)老師就教我們要一題多解吧,換個(gè)思路也有辦法,這個(gè)辦法就是ET。

怎么做的呢?a + b + c 會(huì)產(chǎn)生臨時(shí)變量是因?yàn)?C++ 是即時(shí)求值的,在看到 a + b,就先算出一個(gè) temp 的Vector對(duì)象,然后再向下算。如果能進(jìn)行延遲求值,看完整個(gè)表達(dá)式再來(lái)計(jì)算,那么就可以避免這個(gè)temp的產(chǎn)生。

怎么做?

原來(lái)的做法中,operator + 直接進(jìn)行了計(jì)算,既然我們不想它“過(guò)早”的計(jì)算,那么我們就在重新重載一個(gè)operator + 運(yùn)算符,在這個(gè)運(yùn)算中不進(jìn)行真正的運(yùn)算,只是生成一個(gè)對(duì)象,在這個(gè)對(duì)象中把加法運(yùn)算符兩邊的操作數(shù)保留下來(lái)~然后讓它參與到下一步的計(jì)算中去。(好吧,這個(gè)對(duì)象也是臨時(shí)的,但它的代價(jià)非常非常小,我們先不理會(huì)它)。于是我們寫下面的代碼:

class MyVec;

template <typename L>
class ExpPlus {
    L const & lvec;
    MyVec const & rvec;
public:
    ExpPlus(L const& a_l, MyVec const& a_r):
      lvec(a_l), rvec(a_r)
      { }
      int operator [] (size_t a_idx) const;
};

// Point 1
template <typename L>
ExpPlus<L> operator + (L const& a_l, MyVec const & a_r) {
    return ExpPlus<L>(a_l, a_r);
}

class MyVec
{
public:
    MyVec(){
        p = new int[SIZE];
    }

    MyVec(MyVec const& a_r) {
        p = new int[SIZE];
        memcpy(p, a_r.p, SIZE * sizeof(int));
    }

    template <typename Exp>
    MyVec(Exp const& a_r) {
        p = new int[SIZE];
        for (size_t i = 0; i < SIZE; ++i) {
            p[i] += a_r[i];
        }
    }

    ~MyVec(){delete [] p;}

    MyVec& operator = (MyVec const& a_r) {
        if (this != &a_r) {
            delete [] p;
            p = new int[SIZE];
            memcpy(p, a_r.p, SIZE * sizeof(int));
        }
        return *this;
    }

    template <typename Exp>
    MyVec& operator = (Exp const & a_r) {
        delete [] p;
        p = new int[SIZE];
        for (size_t i = 0; i < SIZE; ++i) {
            p[i] += a_r[i];
        }
        return *this;
    }

    int& operator [](size_t a_idx) { 
        return p[a_idx];
    }

    int operator [](size_t a_idx)const { 
        return p[a_idx];
    }
private:
    static int const SIZE = 100;
    int* p;
};

template <typename L>
int ExpPlus<L>::operator [] (size_t a_idx) const {
    return lvec[a_idx] + rvec[a_idx];
}

int main(int argc, char* argv[])
{
    MyVec a, b, c;
    MyVec d = a + b + c;
    return 0;
}

比起之前的代碼來(lái)說(shuō),這段代碼有幾個(gè)重要的修改:首先,我們?cè)黾恿艘粋€(gè)模板類 ExpPlus,用它來(lái)代表加法計(jì)算的“表達(dá)式”,但在進(jìn)行加法時(shí),它本身并不進(jìn)行真正的計(jì)算。對(duì)這個(gè)類,定義了下標(biāo)運(yùn)算符,這個(gè)運(yùn)算符中才進(jìn)行了真正的加法計(jì)算。然后,對(duì)于原來(lái)的 MyVec,我們重載它的賦值運(yùn)算符,讓它在賦值的時(shí)候通過(guò)ExpPlus的下標(biāo)運(yùn)算符來(lái)獲得計(jì)算結(jié)果(也就是,在賦值操作時(shí)才真正的進(jìn)行了計(jì)算!)。

上面這段話,對(duì)于不了解ET的人來(lái)說(shuō),也許一時(shí)間還不容易明白,我們一步一步來(lái):

在 d = a + b + c 這個(gè)式子中,首先遇到 a + b,這時(shí),模板函數(shù) operator + 會(huì)被調(diào)用(代碼中注釋了“Point 1 ”),這時(shí)只是生成一個(gè)臨時(shí)的ExpPlus<MyVec>對(duì)象(我們叫它 t1 吧),不做計(jì)算,只是保留計(jì)算的左右操作數(shù)(也就是a和b),接著,t1 + c ,再次調(diào)用同樣的 operator + ,而且也只是生成一個(gè)對(duì)象(我們叫它 t2 吧),這個(gè)對(duì)象的類型是 ExpPlus<ExpPlus<MyVec>>,同樣,t2 在這里只是保留了兩邊的操作數(shù)(也就是 t1 和 c)。直到整個(gè)表達(dá)式“做完”,沒(méi)有任何東西進(jìn)行了計(jì)算,所做的事情實(shí)際上只是用 ExpPlus 這個(gè)模板類把計(jì)算式的信息記錄下來(lái)了(當(dāng)然,這些信息就是參與計(jì)算的操作數(shù))。

最后,當(dāng)進(jìn)行 d = t2 的時(shí)候,MyVec 的賦值運(yùn)算符被調(diào)用(用 t2 作參數(shù))。注意,這個(gè)調(diào)用中的語(yǔ)句 p[i] = t2[i],其中 t2[i] 通過(guò)重載的下標(biāo)運(yùn)算符,展開(kāi)成 t1[i] + c[i],同理 t1[i] 又再次展開(kāi),成為 a[i]+b[i],最終,p[i] = t2[i] 就變成了:p[i] = a[i] + b[i] + c[i])(當(dāng)然,里面參雜了內(nèi)聯(lián)的效果,這些函數(shù)都是非常容易被內(nèi)聯(lián)的)。就像變“魔術(shù)”一樣,我們通過(guò)ExpPlus完成了“延遲計(jì)算”,并避免了大型的 MyVec 臨時(shí)對(duì)象的產(chǎn)生。

這基本上就是 ET 的“原理”了吧。我們來(lái)“專門化”一下 ET 的好處:

  • To create a domain-specific embedded language (DSEL) in C++
  • To support lazy evaluation of C++ expressions (e.g., mathematical expressions), which can be executed much later in the program from the point of their definition.
  • To pass an expression — not the result of the expression — as a parameter to a function.

這樣,用 ET 就能兼顧到“直觀”和“效率”了。

ET 中 C++ 中的類庫(kù)里已經(jīng)有非常多的應(yīng)用了(包括 boost 中的多個(gè)子庫(kù),以及 Blitz++ 等高性能數(shù)學(xué)庫(kù))

總結(jié)

(N)RVO 是編譯器為我們做的優(yōu)化手段,在能進(jìn)行優(yōu)化的情況下,NRVO 的表現(xiàn)是非常好的,因?yàn)樗耪嬲谋苊饬伺R時(shí)對(duì)象的產(chǎn)生(rvalue reference 和 expression template 中都可能還存在一些小型臨時(shí)對(duì)象),但 (N)RVO 有很多的限制條件。右值引用(rvalue reference )和 move 語(yǔ)意彌補(bǔ)了 (N)RVO 的不足之處,使得臨時(shí)對(duì)象的開(kāi)銷最小化成為可能,但這也是有局限的,比如,嗯,如果一個(gè)類本身不動(dòng)態(tài)地?fù)碛匈Y源……,那 move 就沒(méi)有意義了。Expression Template 保持了表達(dá)式直觀和效率兩者,很強(qiáng)大,但很顯然它太復(fù)雜,主要是作為類庫(kù)的設(shè)計(jì)者的武器。另外,它也可能使得使用者要理解一些“新”東西,比如,如果我想存儲(chǔ)表達(dá)式的中間值,那么 <ExpPlus<ExpPlus<...<MyVec>...> 一定會(huì)讓我很頭大(不過(guò)有了 C++0x 的 auto 就好多了,呵呵)。

 

全文完!

 

 

posted on 2009-12-03 23:45 唐風(fēng) 閱讀(1862) 評(píng)論(14)  編輯 收藏 引用 所屬分類: 語(yǔ)言技術(shù)

評(píng)論

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(下) 2009-12-04 00:22 OwnWaterloo
哦…… 原來(lái)這種技術(shù)叫expression template……

其實(shí)我心里一直這么叫它的:operation proxy……
  回復(fù)  更多評(píng)論
  

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(下) 2009-12-04 12:35 陳梓瀚(vczh)
不能解決問(wèn)題嘛,假如我
MyVec a,b,c,d;
d=a+(b+c);
結(jié)果還是產(chǎn)生了跟以前一樣多的臨時(shí)對(duì)象(好像少了一個(gè)?但還是很多,如果列表夠長(zhǎng))

這么設(shè)計(jì)ExpPlus其實(shí)是錯(cuò)誤的。  回復(fù)  更多評(píng)論
  

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(下) 2009-12-04 12:36 陳梓瀚(vczh)
@陳梓瀚(vczh)
這個(gè)錯(cuò)誤也造成了你需要ExpPlus<ExpPlus<...<MyVec>...>>這種囧類型了。你有沒(méi)有想過(guò)讓ExpPlus<I>+ExpPlus<I>==ExpPlus<I>?  回復(fù)  更多評(píng)論
  

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(下) 2009-12-04 18:26 YESHG!
俺來(lái)支持下。
二元操作符相當(dāng)于一個(gè)函數(shù),函數(shù)返回需要生成臨時(shí)對(duì)象,如果臨時(shí)對(duì)象過(guò)大將產(chǎn)生效率問(wèn)題。ET用可以忽略不計(jì)的臨時(shí)對(duì)象代替大的臨時(shí)對(duì)象,將多個(gè)二元操作封到了一個(gè)函數(shù)中,減少了許多過(guò)大的臨時(shí)對(duì)象的產(chǎn)生。
假如MyVec的構(gòu)造函數(shù)中不分配那么多空間的話,其實(shí)這個(gè)開(kāi)銷還好,呵呵。對(duì)象過(guò)大的話,一般使用指針去更改對(duì)象內(nèi)具體的成員了,而不是整個(gè)對(duì)象作為參數(shù)傳過(guò)來(lái)傳過(guò)去,當(dāng)然,這樣可能沒(méi)后者直觀……  回復(fù)  更多評(píng)論
  

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(下) 2009-12-04 18:35 YESHG!
雖然沒(méi)有產(chǎn)生很多臨時(shí)的MyVec,但是產(chǎn)生了很多臨時(shí)的int,函數(shù)調(diào)用的次數(shù)也多了幾次,這里就是用int換MyVec的做法。
俺發(fā)現(xiàn)俺還是不喜歡用模板啊,看了就暈乎。  回復(fù)  更多評(píng)論
  

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(下) 2009-12-04 18:41 唐風(fēng)
@陳梓瀚(vczh)
嗯嗯,好敏銳啊,你說(shuō)得很對(duì)。
d=a+(b+c);
這種在這段程序里是會(huì)產(chǎn)生編譯錯(cuò)誤的……

這個(gè)模板類確實(shí)非常的不完善,對(duì)于一個(gè)“可用”的ExpXXX的話,應(yīng)該要是左右操作數(shù)都需要泛化的。為了進(jìn)一步的重用,可以再泛化操作類型(加減乘)。

這篇文章里我想把重點(diǎn)放在“它可以消除臨對(duì)象上”,為了能更“簡(jiǎn)單”地說(shuō)明ET,所以寫的例子很簡(jiǎn)陋,不過(guò)我想大概的做法已經(jīng)點(diǎn)到了。

完善的做法比較復(fù)雜,所以我認(rèn)為這個(gè)庫(kù)設(shè)計(jì)都用的武器,寫應(yīng)用層邏輯時(shí)也許不太會(huì)用到?(調(diào)試、維護(hù)都不容易啊……)

下面有一篇文章,從頭開(kāi)始一點(diǎn)一點(diǎn)地完善這個(gè)ExpXXX,講解得非常細(xì)~,每一個(gè)改善是為了什么!(不過(guò)是日文的,嘿,YESHG,為你準(zhǔn)備的!中文英文的應(yīng)該也有,不過(guò)我沒(méi)搜到這么細(xì)致的,呵呵,不過(guò)對(duì)《C++templates》里的例子應(yīng)該也夠看了。)
http://homepage1.nifty.com/herumi/prog/prog81.html#MOTIVATION

PS:
至于那個(gè)囧類型,我還沒(méi)看到有什么好的做法。因?yàn)橐屪笥也僮鲾?shù)接受不同的表達(dá)式(a,a+b,a+b*c等等等等)才可用,所以操作數(shù)的“類型”不能固定,ExpPlus<I>+ExpPlus<I>==ExpPlus<I>,感覺(jué)行不通。你有什么好做法呢?

  回復(fù)  更多評(píng)論
  

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(下) 2009-12-04 18:49 唐風(fēng)
@YESHG!
謝謝老大支持!!

配合內(nèi)聯(lián) RVO,很多情況下這些臨時(shí)小對(duì)象也可以消失,你看看我上面回復(fù)中給的鏈接,MS 有說(shuō)明……

至于不習(xí)慣模板,嘿嘿,吐啊吐啊就習(xí)慣了。:)

  回復(fù)  更多評(píng)論
  

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(下) 2009-12-04 18:51 唐風(fēng)
@OwnWaterloo

operation proxy……

好形象啊,哈哈
你上篇的回復(fù)里就說(shuō)到了這個(gè)呢,不過(guò)我是事后才認(rèn)識(shí)到……:P

  回復(fù)  更多評(píng)論
  

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(下) 2009-12-07 11:36 Wang Feng
ans = a+b+c+d+e+f+....;
如果可以并行的話,這樣很有優(yōu)勢(shì)
ans = ((a+b)+(c+d))+((e+f)+(g+h));
你這個(gè)+=雖然省去了一些臨時(shí)對(duì)象,不過(guò)也只好一個(gè)一個(gè)乖乖地+=了,單個(gè)cpu的時(shí)候沒(méi)有事情,多個(gè)cpu的時(shí)候,大好時(shí)間都浪費(fèi)了。  回復(fù)  更多評(píng)論
  

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(下) 2009-12-07 19:24 唐風(fēng)
@Wang Feng
確實(shí)如你所言。謝謝你的回復(fù)。

說(shuō)實(shí)話,“并行計(jì)算”這種高級(jí)貨,我還真沒(méi)玩過(guò),嘿嘿。

嗯嗯,真心求教:
這方面有沒(méi)有比較好的已經(jīng)成熟的做法(庫(kù)?)?能不能介紹一下?如果一個(gè)表達(dá)式比較復(fù)雜(比如有加減乘、有括號(hào)之類)有什么算法能正確地最優(yōu)地根據(jù)可以并行的“行程”數(shù)來(lái)分配計(jì)算子過(guò)程?各子過(guò)程的之間的“通信”是怎么做的呢?會(huì)像一般“多線程”中的鎖機(jī)制那樣嗎(當(dāng)然,我對(duì)鎖這東西的理解也限于“理論”范疇內(nèi),呵呵)?

PS:
剛才回訪了你的 blog,里面大多都是算法方面的東西啊,呵呵。向你學(xué)習(xí) :D




  回復(fù)  更多評(píng)論
  

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(下) 2009-12-08 16:50 陳梓瀚(vczh)
竟然被你發(fā)現(xiàn)我的百度宅博  回復(fù)  更多評(píng)論
  

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(下) 2009-12-08 18:15 唐風(fēng)
@陳梓瀚(vczh)
好吧,我只能說(shuō),是你自己在 cppblog 的鏈接中列出來(lái)的。哈哈哈哈 :P
閣下愛(ài)好很廣嘛,編譯原理狂人(別人這么叫你的) + 漫迷 ……

嗯嗯,凡有回復(fù)必回訪是我的原則,哈哈,也是想通這這種途徑了解對(duì)方,多交些朋友



  回復(fù)  更多評(píng)論
  

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(下) 2013-11-17 00:09 ligand
最后,當(dāng)進(jìn)行 d = t2 的時(shí)候,MyVec 的賦值運(yùn)算符被調(diào)用(用 t2 作參數(shù))。
======================
這句話是說(shuō)的。這里調(diào)用的不是賦值運(yùn)算符,而是拷貝構(gòu)造函數(shù)。  回復(fù)  更多評(píng)論
  

# re: 與臨時(shí)對(duì)象的斗爭(zhēng)(下) 2013-11-17 00:12 ligand
表達(dá)式模板,看起來(lái)很美:通過(guò)保存對(duì)操作數(shù)(operand)的引用,避免了構(gòu)造龐大的臨時(shí)對(duì)象(如涉及大量的資源、動(dòng)態(tài)內(nèi)存的獲取)。 的確效率提高了。  回復(fù)  更多評(píng)論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久国产乱子精品免费女| 亚洲欧美色婷婷| 欧美啪啪一区| 国产精品99久久久久久久久久久久| 亚洲人成精品久久久久| 欧美午夜精品| 久久精品国产成人| 裸体一区二区| 亚洲私人影吧| 久久大香伊蕉在人线观看热2| 黄色日韩网站视频| 亚洲伦理在线免费看| 欧美护士18xxxxhd| 欧美激情综合五月色丁香| 亚洲免费视频成人| 久久成人人人人精品欧| 99精品欧美一区二区三区| 亚洲一区二区三区视频播放| 在线日韩中文字幕| 一区二区三区高清在线| 在线免费观看日本一区| 一区二区三区精密机械公司 | 亚洲欧美欧美一区二区三区| 韩国在线一区| 亚洲天堂网在线观看| 亚洲国产成人久久综合一区| 中文成人激情娱乐网| 在线免费一区三区| 在线一区二区三区四区| 亚洲激情六月丁香| 欧美一区二区三区视频在线| 一区二区三区免费观看| 久久婷婷麻豆| 亚洲第一区在线观看| 国产婷婷一区二区| 最新精品在线| 亚洲高清久久| 欧美在线一二三| 亚洲在线视频免费观看| 猛干欧美女孩| 蜜桃av一区| 国一区二区在线观看| 亚洲一区一卡| 亚洲尤物影院| 欧美日韩伦理在线| 亚洲人成免费| 亚洲欧洲中文日韩久久av乱码| 欧美一区激情| 久久成人精品无人区| 国产精品久久97| 日韩视频在线一区二区三区| 亚洲乱亚洲高清| 亚洲精品一区二区三区婷婷月| 精品999久久久| 久久高清一区| 久久深夜福利免费观看| 国产日韩欧美不卡在线| 午夜精品久久久久久久蜜桃app | 久久精品麻豆| 亚洲精品乱码久久久久久按摩观| 久久大逼视频| 久久人体大胆视频| 在线观看成人av电影| 久久久久国产精品厨房| 亚洲美女在线看| 欧美国产综合| 日韩视频精品在线| 亚洲一区二区三区影院| 国产精品国产三级国产普通话三级| 在线综合欧美| 久久精品一区二区三区四区 | 欧美日韩免费观看一区| 宅男在线国产精品| 欧美怡红院视频一区二区三区| 国产欧美精品xxxx另类| 久久精品2019中文字幕| 欧美成黄导航| 亚洲天堂av综合网| 国产伦精品一区二区三| 久久裸体艺术| 亚洲人成网在线播放| 亚洲伊人久久综合| 国产亚洲精品v| 欧美 日韩 国产一区二区在线视频| 亚洲激情av在线| 欧美一级大片在线观看| 激情亚洲网站| 欧美日韩亚洲系列| 久久av一区二区三区| 欧美激情免费观看| 午夜精品三级视频福利| 欧美成人一区二免费视频软件| 亚洲欧洲视频| 久久aⅴ国产欧美74aaa| 亚洲精品一线二线三线无人区| 国产精品福利网站| 久久久久天天天天| 久久亚洲精品中文字幕冲田杏梨| 欧美日韩高清在线观看| 久久久久久午夜| 亚洲日本aⅴ片在线观看香蕉| 欧美日韩国产综合视频在线观看| 午夜欧美大尺度福利影院在线看| 麻豆久久久9性大片| 亚洲自拍16p| 亚洲理论电影网| 国产一区二区三区不卡在线观看 | 亚洲午夜精品一区二区三区他趣 | 亚洲午夜久久久| 在线视频国产日韩| 国产精品夜色7777狼人| 欧美福利视频在线| 久久久久久久999精品视频| 一区二区日韩免费看| 亚洲韩日在线| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲综合另类| 一本色道**综合亚洲精品蜜桃冫| 国内精品美女在线观看| 国产精品视频一区二区三区| 欧美精品粉嫩高潮一区二区| 久久婷婷蜜乳一本欲蜜臀| 午夜免费日韩视频| 亚洲一区二区欧美日韩| 亚洲麻豆一区| 亚洲精品一区二区三区在线观看| 欧美国产日韩视频| 欧美gay视频激情| 裸体一区二区三区| 久久亚洲综合色| 久久精品中文字幕一区| 欧美一区二区日韩一区二区| 亚洲欧美在线网| 亚洲欧美www| 亚洲一区二区免费在线| 亚洲午夜精品17c| 亚洲婷婷在线| 亚洲永久在线| 午夜在线a亚洲v天堂网2018| 亚洲欧美日韩系列| 午夜国产一区| 亚洲欧美在线另类| 久久精品国产2020观看福利| 久久精品久久99精品久久| 久久久久久亚洲综合影院红桃 | 日韩视频在线观看| 在线亚洲电影| 亚洲欧美日韩成人高清在线一区| 午夜精品亚洲一区二区三区嫩草| 午夜在线精品| 久久午夜电影网| 欧美岛国在线观看| 欧美视频国产精品| 亚洲欧美影院| 久久精品视频免费| 免费在线观看一区二区| 欧美精品99| 国产精品久久久久av| 国产一区二区高清不卡| 亚洲二区在线视频| 99精品99| 久久国产成人| 亚洲高清成人| 亚洲视频一区二区免费在线观看| 午夜精彩国产免费不卡不顿大片| 久久久久久噜噜噜久久久精品| 欧美1区3d| 国产精品素人视频| 亚洲国产1区| 亚洲综合社区| 欧美v亚洲v综合ⅴ国产v| 国产原创一区二区| 久久精品国产一区二区三| 久久久久综合网| 欧美日韩高清在线| 国产亚洲在线观看| 亚洲美女免费视频| 久久久精品一品道一区| 亚洲精品欧美日韩专区| 欧美一区二区三区在线观看视频| 欧美大片91| 国产一区二区三区的电影| 99视频精品全国免费| 久久一区精品| 亚洲午夜在线观看| 欧美激情黄色片| 精品电影在线观看| 午夜精品在线看| 亚洲黄一区二区三区| 久久久久91| 国产拍揄自揄精品视频麻豆| 99在线热播精品免费| 久久久久欧美| 午夜欧美视频| 欧美午夜精品理论片a级大开眼界| 亚洲国产美女精品久久久久∴| 久久精品72免费观看| 一区二区三区日韩| 欧美日韩福利视频| 日韩视频在线观看免费|