日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 对象的内存布局

發布時間:2024/9/30 c/c++ 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 对象的内存布局 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C++?對象的內存布局(上)

?

陳皓

http://blog.csdn.net/haoel

?


前言

?

07年12月,我寫了一篇《C++虛函數表解析》的文章,引起了大家的興趣。有很多朋友對我的文章留了言,有鼓勵我的,有批評我的,還有很多問問題的。我在這里一并對大家的留言表示感謝。這也是我為什么再寫一篇續言的原因。因為,在上一篇文章中,我用了的示例都是非常簡單的,主要是為了說明一些機理上的問題,也是為了圖一些表達上方便和簡單。不想,這篇文章成為了打開C++對象模型內存布局的一個引子,引發了大家對C++對象的更深層次的討論。當然,我之前的文章還有很多方面沒有涉及,從我個人感覺下來,在談論虛函數表里,至少有以下這些內容沒有涉及:

1)有成員變量的情況。

2)有重復繼承的情況。

3)有虛擬繼承的情況。

4)有鉆石型虛擬繼承的情況。

?

這些都是我本篇文章需要向大家說明的東西。所以,這篇文章將會是《C++虛函數表解析》的一個續篇,也是一篇高級進階的文章。我希望大家在讀這篇文章之前對C++有一定的基礎和了解,并能先讀我的上一篇文章。因為這篇文章的深度可能會比較深,而且會比較雜亂,我希望你在讀本篇文章時不會有大腦思維紊亂導致大腦死機的情況。;-)

?

對象的影響因素

?

簡而言之,我們一個類可能會有如下的影響因素:

?

1)成員變量

2)虛函數(產生虛函數表)

3)單一繼承(只繼承于一個類)

4)多重繼承(繼承多個類)

5)重復繼承(繼承的多個父類中其父類有相同的超類)

6)虛擬繼承(使用virtual方式繼承,為了保證繼承后父類的內存布局只會存在一份)

上述的東西通常是C++這門語言在語義方面對對象內部的影響因素,當然,還會有編譯器的影響(比如優化),還有字節對齊的影響。在這里我們都不討論,我們只討論C++語言上的影響。

?

本篇文章著重討論下述幾個情況下的C++對象的內存布局情況。

?

1)單一的一般繼承(帶成員變量、虛函數、虛函數覆蓋)

2)單一的虛擬繼承(帶成員變量、虛函數、虛函數覆蓋)

3)多重繼承(帶成員變量、虛函數、虛函數覆蓋)

4)重復多重繼承(帶成員變量、虛函數、虛函數覆蓋)

5)鉆石型的虛擬多重繼承(帶成員變量、虛函數、虛函數覆蓋)

?

我們的目標就是,讓事情越來越復雜。

?

知識復習

?

我們簡單地復習一下,我們可以通過對象的地址來取得虛函數表的地址,如:

?

??????????typedef?void(*Fun)(void);

?

????????????Base b;

?

????????????Fun pFun = NULL;

?

????????????cout <<?"虛函數表地址:"?<< (int*)(&b) << endl;

????????????cout <<?"虛函數表?—?第一個函數地址:"?<< (int*)*(int*)(&b) << endl;

?

????????????// Invoke the first virtual function?

????????????pFun = (Fun)*((int*)*(int*)(&b));

????????????pFun();

?

我們同樣可以用這種方式來取得整個對象實例的內存布局。因為這些東西在內存中都是連續分布的,我們只需要使用適當的地址偏移量,我們就可以獲得整個內存對象的布局。

?

本篇文章中的例程或內存布局主要使用如下編譯器和系統:

1)Windows XP?和?VC++ 2003

2)Cygwin?和?G++ 3.4.4

?

單一的一般繼承

?

下面,我們假設有如下所示的一個繼承關系:

?

?

請注意,在這個繼承關系中,父類,子類,孫子類都有自己的一個成員變量。而了類覆蓋了父類的f()方法,孫子類覆蓋了子類的g_child()及其超類的f()。

?

我們的源程序如下所示:

?

class?Parent {

public:

????int?iparent;

????Parent ():iparent (10) {}

????virtual?void?f() { cout <<?"?Parent::f()"?<< endl; }

????virtual?void?g() { cout <<?"?Parent::g()"?<< endl; }

????virtual?void?h() { cout <<?"?Parent::h()"?<< endl; }

?

};

?

class?Child :?public?Parent {

public:

????int?ichild;

????Child():ichild(100) {}

????virtual?void?f() { cout <<?"Child::f()"?<< endl; }

????virtual?void?g_child() { cout <<?"Child::g_child()"?<< endl; }

????virtual?void?h_child() { cout <<?"Child::h_child()"?<< endl; }

};

?

class?GrandChild :?public?Child{

public:

????int?igrandchild;

????GrandChild():igrandchild(1000) {}

????virtual?void?f() { cout <<?"GrandChild::f()"?<< endl; }

????virtual?void?g_child() { cout <<?"GrandChild::g_child()"?<< endl; }

????virtual?void?h_grandchild() { cout <<?"GrandChild::h_grandchild()"?<< endl; }

};

我們使用以下程序作為測試程序:(下面程序中,我使用了一個int** pVtab?來作為遍歷對象內存布局的指針,這樣,我就可以方便地像使用數組一樣來遍歷所有的成員包括其虛函數表了,在后面的程序中,我也是用這樣的方法的,請不必感到奇怪,)

?

????typedef?void(*Fun)(void);

????GrandChild gc;

???

?

????int** pVtab = (int**)&gc;

?

????cout <<?"[0] GrandChild::_vptr->"?<< endl;

????for?(int?i=0; (Fun)pVtab[0][i]!=NULL; i++){

????????????????pFun = (Fun)pVtab[0][i];

????????????????cout <<?"????["<<i<<"] ";

????????????????pFun();

????}

????cout <<?"[1] Parent.iparent = "?<< (int)pVtab[1] << endl;

????cout <<?"[2] Child.ichild = "?<< (int)pVtab[2] << endl;

????cout <<?"[3] GrandChild.igrandchild = "?<< (int)pVtab[3] << endl;

?

其運行結果如下所示:(在VC++ 2003和G++ 3.4.4下)

?

[0] GrandChild::_vptr->

????[0] GrandChild::f()

????[1] Parent::g()

????[2] Parent::h()

????[3] GrandChild::g_child()

????[4] Child::h1()

????[5] GrandChild::h_grandchild()

[1] Parent.iparent = 10

[2] Child.ichild = 100

[3] GrandChild.igrandchild = 1000

?

使用圖片表示如下:

?

?

?

可見以下幾個方面:

1)虛函數表在最前面的位置。

2)成員變量根據其繼承和聲明順序依次放在后面。

3)在單一的繼承中,被overwrite的虛函數在虛函數表中得到了更新。

?

?

?

?

?

多重繼承

?

下面,再讓我們來看看多重繼承中的情況,假設有下面這樣一個類的繼承關系。注意:子類只overwrite了父類的f()函數,而還有一個是自己的函數(我們這樣做的目的是為了用g1()作為一個標記來標明子類的虛函數表)。而且每個類中都有一個自己的成員變量:

?

?

?

我們的類繼承的源代碼如下所示:父類的成員初始為10,20,30,子類的為100

?

class?Base1 {

public:

????int?ibase1;

????Base1():ibase1(10) {}

????virtual?void?f() { cout <<?"Base1::f()"?<< endl; }

????virtual?void?g() { cout <<?"Base1::g()"?<< endl; }

????virtual?void?h() { cout <<?"Base1::h()"?<< endl; }

?

};

?

class?Base2 {

public:

????int?ibase2;

????Base2():ibase2(20) {}

????virtual?void?f() { cout <<?"Base2::f()"?<< endl; }

????virtual?void?g() { cout <<?"Base2::g()"?<< endl; }

????virtual?void?h() { cout <<?"Base2::h()"?<< endl; }

};

?

class?Base3 {

public:

????int?ibase3;

????Base3():ibase3(30) {}

????virtual?void?f() { cout <<?"Base3::f()"?<< endl; }

????virtual?void?g() { cout <<?"Base3::g()"?<< endl; }

????virtual?void?h() { cout <<?"Base3::h()"?<< endl; }

};

?

?

class?Derive :?public?Base1,?public?Base2,?public?Base3 {

public:

????int?iderive;

????Derive():iderive(100) {}

????virtual?void?f() { cout <<?"Derive::f()"?<< endl; }

????virtual?void?g1() { cout <<?"Derive::g1()"?<< endl; }

};

?

我們通過下面的程序來查看子類實例的內存布局:下面程序中,注意我使用了一個s變量,其中用到了sizof(Base)來找下一個類的偏移量。(因為我聲明的是int成員,所以是4個字節,所以沒有對齊問題。關于內存的對齊問題,大家可以自行試驗,我在這里就不多說了)

?

?????????????typedef?void(*Fun)(void);

???????????????Derive d;

?

????????????????int** pVtab = (int**)&d;

?

????????????????cout <<?"[0] Base1::_vptr->"?<< endl;

????????????????pFun = (Fun)pVtab[0][0];

????????????????cout <<?"?????[0] ";

????????????????pFun();

?

????????????????pFun = (Fun)pVtab[0][1];

????????????????cout <<?"?????[1] ";pFun();

?

????????????????pFun = (Fun)pVtab[0][2];

????????????????cout <<?"?????[2] ";pFun();

?

????????????????pFun = (Fun)pVtab[0][3];

????????????????cout <<?"?????[3] ";?pFun();

?

????????????????pFun = (Fun)pVtab[0][4];

????????????????cout <<?"?????[4] ";?cout<<pFun<<endl;

?

????????????????cout <<?"[1] Base1.ibase1 = "?<< (int)pVtab[1] << endl;

?

?

????????????????int?s =?sizeof(Base1)/4;

?

????????????????cout <<?"["?<< s <<?"] Base2::_vptr->"<<endl;

????????????????pFun = (Fun)pVtab[s][0];

????????????????cout <<?"?????[0] "; pFun();

?

????????????????Fun = (Fun)pVtab[s][1];

????????????????cout <<?"?????[1] "; pFun();

?

????????????????pFun = (Fun)pVtab[s][2];

????????????????cout <<?"?????[2] ";?pFun();

?

????????????????pFun = (Fun)pVtab[s][3];

????????????????out <<?"?????[3] ";

????????????????cout<<pFun<<endl;

?

????????????????cout <<?"["<< s+1?<<"] Base2.ibase2 = "?<< (int)pVtab[s+1] << endl;

?

????????????????s = s +?sizeof(Base2)/4;

????????????????cout <<?"["?<< s <<?"] Base3::_vptr->"<<endl;

????????????????pFun = (Fun)pVtab[s][0];

????????????????cout <<?"?????[0] "; pFun();

?

????????????????pFun = (Fun)pVtab[s][1];

????????????????cout <<?"?????[1] ";?pFun();

?

????????????????pFun = (Fun)pVtab[s][2];

????????????????cout <<?"?????[2] ";?pFun();

?

????????????????pFun = (Fun)pVtab[s][3];

?????????????????cout <<?"?????[3] ";

????????????????cout<<pFun<<endl;

?

????????????????s++;

????????????????cout <<?"["<< s <<"] Base3.ibase3 = "?<< (int)pVtab[s] << endl;

????????????????s++;

????????????????cout <<?"["<< s <<"] Derive.iderive = "?<< (int)pVtab[s] << endl;

?

其運行結果如下所示:(在VC++ 2003和G++ 3.4.4下)

[0] Base1::_vptr->

?????[0] Derive::f()

?????[1] Base1::g()

?????[2] Base1::h()

?????[3] Driver::g1()

?????[4] 00000000????????注意:在GCC下,這里是1

[1] Base1.ibase1 = 10

[2] Base2::_vptr->

?????[0] Derive::f()

?????[1] Base2::g()

?????[2] Base2::h()

?????[3] 00000000????????注意:在GCC下,這里是1

[3] Base2.ibase2 = 20

[4] Base3::_vptr->

?????[0] Derive::f()

?????[1] Base3::g()

?????[2] Base3::h()

?????[3] 00000000

[5] Base3.ibase3 = 30

[6] Derive.iderive = 100


使用圖片表示是下面這個樣子:

?

?

我們可以看到:

1)??每個父類都有自己的虛表。

2)??子類的成員函數被放到了第一個父類的表中。

3)??內存布局中,其父類布局依次按聲明順序排列。

4)??每個父類的虛表中的f()函數都被overwrite成了子類的f()。這樣做就是為了解決不同的父類類型的指針指向同一個子類實例,而能夠調用到實際的函數


思考一個問題:

如果Base2類中有一個函數virtual void ff(){cout<<"Base2:ff()"<<endl;}

Derive也有一個函數virtual void ff(){cout<<"Derive:ff()"<<endl;}

此時,Derive的對象中,base1的虛表不變化,但是base2的續表增加了一個Derive::ff()



C++?對象的內存布局(下)

?

陳皓

http://blog.csdn.net/haoel

?

?


?

重復繼承

?

下面我們再來看看,發生重復繼承的情況。所謂重復繼承,也就是某個基類被間接地重復繼承了多次。

?

下圖是一個繼承圖,我們重載了父類的f()函數。

?


?

其類繼承的源代碼如下所示。其中,每個類都有兩個變量,一個是整形(4字節),一個是字符(1字節),而且還有自己的虛函數,自己overwrite父類的虛函數。如子類D中,f()覆蓋了超類的函數,?f1()?和f2()?覆蓋了其父類的虛函數,Df()為自己的虛函數。

?

class?B

{

????public:

????????int?ib;

????????char?cb;

????public:

????????B():ib(0),cb('B') {}

?

????????virtual?void?f() { cout <<?"B::f()"?<< endl;}

????????virtual?void?Bf() { cout <<?"B::Bf()"?<< endl;}

};

class?B1 :??public?B

{

????public:

????????int?ib1;

????????char?cb1;

????public:

????????B1():ib1(11),cb1('1') {}

?

????????virtual?void?f() { cout <<?"B1::f()"?<< endl;}

????????virtual?void?f1() { cout <<?"B1::f1()"?<< endl;}

????????virtual?void?Bf1() { cout <<?"B1::Bf1()"?<< endl;}

?

};

class?B2:??public?B

{

????public:

????????int?ib2;

????????char?cb2;

????public:

????????B2():ib2(12),cb2('2') {}

?

????????virtual?void?f() { cout <<?"B2::f()"?<< endl;}

????????virtual?void?f2() { cout <<?"B2::f2()"?<< endl;}

????????virtual?void?Bf2() { cout <<?"B2::Bf2()"?<< endl;}

???????

};

?

class?D :?public?B1,?public?B2

{

????public:

????????int?id;

????????char?cd;

????public:

????????D():id(100),cd('D') {}

?

????????virtual?void?f() { cout <<?"D::f()"?<< endl;}

????????virtual?void?f1() { cout <<?"D::f1()"?<< endl;}

????????virtual?void?f2() { cout <<?"D::f2()"?<< endl;}

????????virtual?void?Df() { cout <<?"D::Df()"?<< endl;}

???????

};

我們用來存取子類內存布局的代碼如下所示:(在VC++ 2003和G++ 3.4.4下)

????typedef?void(*Fun)(void);

????int** pVtab = NULL;

????Fun pFun = NULL;

?

????D d;

????pVtab = (int**)&d;

????cout <<?"[0] D::B1::_vptr->"?<< endl;

????pFun = (Fun)pVtab[0][0];

????cout <<?"?????[0] ";????pFun();

????pFun = (Fun)pVtab[0][1];

????cout <<?"?????[1] ";????pFun();

????pFun = (Fun)pVtab[0][2];

????cout <<?"?????[2] ";????pFun();

????pFun = (Fun)pVtab[0][3];

????cout <<?"?????[3] ";????pFun();

????pFun = (Fun)pVtab[0][4];

????cout <<?"?????[4] ";????pFun();

????pFun = (Fun)pVtab[0][5];

????cout <<?"?????[5] 0x"?<< pFun << endl;

???

????cout <<?"[1] B::ib = "?<< (int)pVtab[1] << endl;

????cout <<?"[2] B::cb = "?<< (char)pVtab[2] << endl;

????cout <<?"[3] B1::ib1 = "?<< (int)pVtab[3] << endl;

????cout <<?"[4] B1::cb1 = "?<< (char)pVtab[4] << endl;

?

????cout <<?"[5] D::B2::_vptr->"?<< endl;

????pFun = (Fun)pVtab[5][0];

????cout <<?"?????[0] ";????pFun();

????pFun = (Fun)pVtab[5][1];

????cout <<?"?????[1] ";????pFun();

????pFun = (Fun)pVtab[5][2];

????cout <<?"?????[2] ";????pFun();

????pFun = (Fun)pVtab[5][3];

????cout <<?"?????[3] ";????pFun();

????pFun = (Fun)pVtab[5][4];

????cout <<?"?????[4] 0x"?<< pFun << endl;

?

????cout <<?"[6] B::ib = "?<< (int)pVtab[6] << endl;

????cout <<?"[7] B::cb = "?<< (char)pVtab[7] << endl;???

????cout <<?"[8] B2::ib2 = "?<< (int)pVtab[8] << endl;

????cout <<?"[9] B2::cb2 = "?<< (char)pVtab[9] << endl;

?

????cout <<?"[10] D::id = "?<< (int)pVtab[10] << endl;

????cout <<?"[11] D::cd = "?<< (char)pVtab[11] << endl;

?

程序運行結果如下:

?

GCC 3.4.4

VC++ 2003

[0] D::B1::_vptr->

?????[0] D::f()

?????[1] B::Bf()

?????[2] D::f1()

?????[3] B1::Bf1()

?????[4] D::f2()

?????[5] 0x1

[1] B::ib = 0

[2] B::cb = B

[3] B1::ib1 = 11

[4] B1::cb1 = 1

[5] D::B2::_vptr->

?????[0] D::f()

?????[1] B::Bf()

?????[2] D::f2()

?????[3] B2::Bf2()

?????[4] 0x0

[6] B::ib = 0

[7] B::cb = B

[8] B2::ib2 = 12

[9] B2::cb2 = 2

[10] D::id = 100

[11] D::cd = D

[0] D::B1::_vptr->

?????[0] D::f()

?????[1] B::Bf()

?????[2] D::f1()

?????[3] B1::Bf1()

?????[4] D::Df()

?????[5] 0x00000000

[1] B::ib = 0

[2] B::cb = B

[3] B1::ib1 = 11

[4] B1::cb1 = 1

[5] D::B2::_vptr->

?????[0] D::f()

?????[1] B::Bf()

?????[2] D::f2()

?????[3] B2::Bf2()

?????[4] 0x00000000

[6] B::ib = 0

[7] B::cb = B

[8] B2::ib2 = 12

[9] B2::cb2 = 2

[10] D::id = 100

[11] D::cd = D

?

下面是對于子類實例中的虛函數表的圖:

?

?

?

我們可以看見,最頂端的父類B其成員變量存在于B1和B2中,并被D給繼承下去了。而在D中,其有B1和B2的實例,于是B的成員在D的實例中存在兩份,一份是B1繼承而來的,另一份是B2繼承而來的。所以,如果我們使用以下語句,則會產生二義性編譯錯誤:

?

D d;

d.ib = 0;???????????????//二義性錯誤

d.B1::ib = 1;???????????//正確

d.B2::ib = 2;???????????//正確


注意,上面例程中的最后兩條語句存取的是兩個變量。雖然我們消除了二義性的編譯錯誤,但B類在D中還是有兩個實例,這種繼承造成了數據的重復,我們叫這種繼承為重復繼承。重復的基類數據成員可能并不是我們想要的。所以,C++引入了虛基類的概念。

?

?

鉆石型多重虛擬繼承

?

虛擬繼承的出現就是為了解決重復繼承中多個間接父類的問題的。鉆石型的結構是其最經典的結構。也是我們在這里要討論的結構:

?

上述的“重復繼承”只需要把B1和B2繼承B的語法中加上virtual?關鍵,就成了虛擬繼承,其繼承圖如下所示:

?

?


?

上圖和前面的“重復繼承”中的類的內部數據和接口都是完全一樣的,只是我們采用了虛擬繼承:其省略后的源碼如下所示:

?

class?B {……};

class?B1 :?virtual?public?B{……};

class?B2:?virtual?public?B{……};

class?D :?public?B1,?public?B2{?……?};

?

在查看D之前,我們先看一看單一虛擬繼承的情況。下面是一段在VC++2003下的測試程序:(因為VC++和GCC的內存而局上有一些細節上的不同,所以這里只給出VC++的程序,GCC下的程序大家可以根據我給出的程序自己仿照著寫一個去試一試):

?

????int** pVtab = NULL;

????Fun pFun = NULL;

?

????B1 bb1;

?

????pVtab = (int**)&bb1;

????cout <<?"[0] B1::_vptr->"?<< endl;

????pFun = (Fun)pVtab[0][0];

????cout <<?"?????[0] ";

????pFun();?//B1::f1();

????cout <<?"?????[1] ";

????pFun = (Fun)pVtab[0][1];

????pFun();?//B1::bf1();

????cout <<?"?????[2] ";

????cout << pVtab[0][2] << endl;

?

????cout <<?"[1] = 0x";

????cout << (int*)*((int*)(&bb1)+1) <<endl;?//B1::ib1

????cout <<?"[2] B1::ib1 = ";

????cout << (int)*((int*)(&bb1)+2) <<endl;?//B1::ib1

????cout <<?"[3] B1::cb1 = ";

????cout << (char)*((int*)(&bb1)+3) << endl;?//B1::cb1

?

????cout <<?"[4] = 0x";

????cout << (int*)*((int*)(&bb1)+4) << endl;?//NULL

?

????cout <<?"[5] B::_vptr->"?<< endl;

????pFun = (Fun)pVtab[5][0];

????cout <<?"?????[0] ";

????pFun();?//B1::f();

????pFun = (Fun)pVtab[5][1];

????cout <<?"?????[1] ";

????pFun();?//B::Bf();

????cout <<?"?????[2] ";

????cout <<?"0x"?<< (Fun)pVtab[5][2] << endl;

?

????cout <<?"[6] B::ib = ";

????cout << (int)*((int*)(&bb1)+6) <<endl;?//B::ib

????cout <<?"[7] B::cb = ";

?

其運行結果如下(我結出了GCC的和VC++2003的對比):

?

GCC 3.4.4

VC++ 2003

[0] B1::_vptr ->

????[0] : B1::f()

????[1] : B1::f1()

????[2] : B1::Bf1()

????[3] : 0

[1] B1::ib1 : 11

[2] B1::cb1 : 1

[3] B::_vptr ->

????[0] : B1::f()

????[1] : B::Bf()

????[2] : 0

[4] B::ib : 0

[5] B::cb : B

[6] NULL : 0

[0] B1::_vptr->

?????[0] B1::f1()

?????[1] B1::Bf1()

?????[2] 0

[1] = 0x00454310??該地址取值后是-4

[2] B1::ib1 = 11

[3] B1::cb1 = 1

[4] = 0x00000000

[5] B::_vptr->

?????[0] B1::f()

?????[1] B::Bf()

?????[2] 0x00000000

[6] B::ib = 0

[7] B::cb = B

?

?

這里,大家可以自己對比一下。關于細節上,我會在后面一并再說。

?

下面的測試程序是看子類D的內存布局,同樣是VC++ 2003的(因為VC++和GCC的內存布局上有一些細節上的不同,而VC++的相對要清楚很多,所以這里只給出VC++的程序,GCC下的程序大家可以根據我給出的程序自己仿照著寫一個去試一試):

?

????D d;

?

????pVtab = (int**)&d;

????cout <<?"[0] D::B1::_vptr->"?<< endl;

????pFun = (Fun)pVtab[0][0];

????cout <<?"?????[0] ";????pFun();?//D::f1();

????pFun = (Fun)pVtab[0][1];

????cout <<?"?????[1] ";????pFun();?//B1::Bf1();

????pFun = (Fun)pVtab[0][2];

????cout <<?"?????[2] ";????pFun();?//D::Df();

????pFun = (Fun)pVtab[0][3];

????cout <<?"?????[3] ";

????cout << pFun << endl;

?

????//cout << pVtab[4][2] << endl;

????cout <<?"[1] = 0x";

????cout <<??(int*)((&dd)+1) <<endl;?//????

?

????cout <<?"[2] B1::ib1 = ";

????cout << *((int*)(&dd)+2) <<endl;?//B1::ib1

????cout <<?"[3] B1::cb1 = ";

????cout << (char)*((int*)(&dd)+3) << endl;?//B1::cb1

?

????//---------------------

????cout <<?"[4] D::B2::_vptr->"?<< endl;

????pFun = (Fun)pVtab[4][0];

????cout <<?"?????[0] ";????pFun();?//D::f2();

????pFun = (Fun)pVtab[4][1];

????cout <<?"?????[1] ";????pFun();?//B2::Bf2();

????pFun = (Fun)pVtab[4][2];

????cout <<?"?????[2] ";

????cout << pFun << endl;

???

????cout <<?"[5] = 0x";

????cout << *((int*)(&dd)+5) << endl;?// ???

?

????cout <<?"[6] B2::ib2 = ";

????cout << (int)*((int*)(&dd)+6) <<endl;?//B2::ib2

????cout <<?"[7] B2::cb2 = ";

????cout << (char)*((int*)(&dd)+7) << endl;?//B2::cb2

?

????cout <<?"[8] D::id = ";

????cout << *((int*)(&dd)+8) << endl;?//D::id

????cout <<?"[9] D::cd = ";

????cout << (char)*((int*)(&dd)+9) << endl;//D::cd

?

????cout <<?"[10]??= 0x";

????cout << (int*)*((int*)(&dd)+10) << endl;

????//---------------------

????cout <<?"[11] D::B::_vptr->"?<< endl;

????pFun = (Fun)pVtab[11][0];

????cout <<?"?????[0] ";????pFun();?//D::f();

????pFun = (Fun)pVtab[11][1];

????cout <<?"?????[1] ";????pFun();?//B::Bf();

????pFun = (Fun)pVtab[11][2];

????cout <<?"?????[2] ";

????cout << pFun << endl;

?

????cout <<?"[12] B::ib = ";

????cout << *((int*)(&dd)+12) << endl;?//B::ib

????cout <<?"[13] B::cb = ";

????cout << (char)*((int*)(&dd)+13) <<endl;//B::cb

?

下面給出運行后的結果(分VC++和GCC兩部份)

?

?

GCC 3.4.4

VC++ 2003

[0] B1::_vptr ->

????[0] : D::f()

????[1] : D::f1()

????[2] : B1::Bf1()

????[3] : D::f2()

????[4] : D::Df()

????[5] : 1

[1] B1::ib1 : 11

[2] B1::cb1 : 1

[3] B2::_vptr ->

????[0] : D::f()

????[1] : D::f2()

????[2] : B2::Bf2()

????[3] : 0

[4] B2::ib2 : 12

[5] B2::cb2 : 2

[6] D::id : 100

[7] D::cd : D

[8] B::_vptr ->

????[0] : D::f()

????[1] : B::Bf()

????[2] : 0

[9] B::ib : 0

[10] B::cb : B

[11] NULL : 0

[0] D::B1::_vptr->

?????[0] D::f1()

?????[1] B1::Bf1()

?????[2] D::Df()

?????[3] 00000000

[1] = 0x0013FDC4????該地址取值后是-4

[2] B1::ib1 = 11

[3] B1::cb1 = 1

[4] D::B2::_vptr->

?????[0] D::f2()

?????[1] B2::Bf2()

?????[2] 00000000

[5] = 0x4539260?????該地址取值后是-4

[6] B2::ib2 = 12

[7] B2::cb2 = 2

[8] D::id = 100

[9] D::cd = D

[10]??= 0x00000000

[11] D::B::_vptr->

?????[0] D::f()

?????[1] B::Bf()

?????[2] 00000000

[12] B::ib = 0

[13] B::cb = B

?

?

關于虛擬繼承的運行結果我就不畫圖了(前面的作圖已經讓我產生了很嚴重的厭倦感,所以就偷個懶了,大家見諒了)

?

在上面的輸出結果中,我用不同的顏色做了一些標明。我們可以看到如下的幾點:

?

1)無論是GCC還是VC++,除了一些細節上的不同,其大體上的對象布局是一樣的。也就是說,先是B1(黃色),然后是B2(綠色),接著是D(灰色),而B這個超類(青藍色)的實例都放在最后的位置。

2)關于虛函數表,尤其是第一個虛表,GCC和VC++有很重大的不一樣。但仔細看下來,還是VC++的虛表比較清晰和有邏輯性。

3)VC++和GCC都把B這個超類放到了最后,而VC++有一個NULL分隔符把B和B1和B2的布局分開。GCC則沒有。

4)VC++中的內存布局有兩個地址我有些不是很明白,在其中我用紅色標出了。取其內容是-4。接道理來說,這個指針應該是指向B類實例的內存地址(這個做法就是為了保證重復的父類只有一個實例的技術)。但取值后卻不是。這點我目前還并不太清楚,還向大家請教。

5)GCC的內存布局中在B1和B2中則沒有指向B的指針。這點可以理解,編譯器可以通過計算B1和B2的size而得出B的偏移量。


總結

以上是生活随笔為你收集整理的C++ 对象的内存布局的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

激情在线免费视频 | 久久久久久国产精品久久 | 久久精品男人的天堂 | 国产精品久久久久久69 | 免费激情在线电影 | 欧美乱码精品一区 | 免费观看国产精品 | 日韩黄色在线观看 | 国产九九热视频 | 国产精品免费久久久久 | 国产精品一区二区久久国产 | 久草精品视频在线看网站免费 | 99久久精品国产亚洲 | www色网站| 在线免费观看亚洲视频 | 天天色天天操综合 | 久久久精品网站 | 91精品国产欧美一区二区 | 久久九九影视网 | 国产精品乱码一区二区视频 | 在线观看日韩 | 欧美一级艳片视频免费观看 | 精品国产乱子伦一区二区 | 中文字幕一区二区三区精华液 | 91在线国产观看 | 国产区高清在线 | 97人人模人人爽人人喊中文字 | 中文字幕 国产专区 | 亚洲国产三级在线观看 | free. 性欧美.com | 久久超| 国产成人av网站 | 婷婷丁香激情五月 | 中文字幕精品www乱入免费视频 | 午夜视频在线观看网站 | 美女露久久 | 国内精品99 | 久久视频在线观看免费 | 国产高清在线精品 | 久久精品久久久久 | 激情视频国产 | 91禁在线观看 | 狠狠色丁香久久婷婷综合_中 | 最新av网站在线观看 | 亚洲一级片免费观看 | 欧美成人性战久久 | 91大神精品视频在线观看 | 中文字幕 在线看 | 国产成人免费观看久久久 | 天天射天天操天天干 | 欧美另类网站 | 男女靠逼app| 黄色av一区二区三区 | 亚洲精品视频一二三 | 丁香色婷| 国产精彩在线视频 | 午夜精品99久久免费 | 97国产情侣爱久久免费观看 | 精壮的侍卫呻吟h | 日韩丝袜 | 中文字幕一区二区三区视频 | www.久久久久 | 久久a v电影 | 欧美极品xxx | av高清不卡 | 国产91精品在线观看 | 在线a亚洲视频播放在线观看 | 中文字幕欧美日韩va免费视频 | 日韩黄视频 | 婷婷色在线资源 | 黄色在线看网站 | 精品国产精品一区二区夜夜嗨 | 国产视频在 | 波多野结衣视频一区二区三区 | 天天射天天射 | 日韩黄色一级电影 | 西西444www大胆无视频 | 人人模人人爽 | 亚洲精品成人av在线 | 在线观看国产91 | 欧美一级片免费播放 | 日韩欧美成 | 亚洲日日夜夜 | 久久av电影 | 国产精品一区二区av影院萌芽 | 国产视频综合在线 | 91片网 | 色久网| 精品免费久久久久 | 精品视频资源站 | 69精品在线观看 | 国产主播大尺度精品福利免费 | 一本一道久久a久久精品蜜桃 | 国产精品每日更新 | 久久成人人人人精品欧 | 久久久久久97三级 | 毛片视频电影 | 毛片888| 久久96国产精品久久99漫画 | 久久久穴| 国产成人一区二区三区电影 | 成人在线播放免费观看 | 欧美韩国在线 | 亚洲精品一区二区三区四区高清 | 国产精品电影在线 | 中文字幕日韩一区二区三区不卡 | av网在线观看 | 婷婷精品国产欧美精品亚洲人人爽 | 中文字幕国产视频 | 成人91av| 国产一卡二卡四卡国 | 欧美性色黄大片在线观看 | 久久一精品 | av丁香| 国产精品久久久久一区二区三区共 | 在线视频欧美日韩 | 亚洲国产精品一区二区久久hs | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 又色又爽的网站 | 在线导航福利 | 成人蜜桃视频 | 在线视频区 | av黄色av| 久草在线视频资源 | 欧美专区亚洲专区 | 欧美另类色图 | 欧美精品在线观看 | 免费观看一级特黄欧美大片 | 日韩中午字幕 | 国产裸体无遮挡 | www.五月婷婷.com | 午夜丰满寂寞少妇精品 | av电影免费在线 | 91av在线精品 | 特级西西人体444是什么意思 | 久久人人爽人人片 | 在线观看日韩中文字幕 | 一区二区三区动漫 | 特级毛片爽www免费版 | 久久久精品国产一区二区电影四季 | 久久国产高清 | 成人久久18免费网站麻豆 | 欧美二区在线播放 | av免费试看| 色成人亚洲 | 在线日本v二区不卡 | 成人久久精品 | 精品视频 | 久久久国产精品久久久 | 97精品国产91久久久久久 | 日韩亚洲国产精品 | 中文字幕乱视频 | 在线黄频 | 国产精品 9999 | 深夜免费网站 | 久久久久免费网站 | 亚洲视频电影在线 | 欧美日韩免费在线视频 | 久久高清免费观看 | 亚洲欧洲成人 | 日本中文字幕高清 | 国产视频1 | 国产精品美女久久久久久网站 | 欧美日韩另类视频 | 中文字幕在线观看视频一区 | 精品五月天| 国产精品久久久久免费 | 欧美一区二区免费在线观看 | 日韩精品一区二区在线视频 | 欧美精品中文字幕亚洲专区 | 日本韩国在线不卡 | 久久热首页 | 国产美女精品视频免费观看 | 久久久www免费电影网 | 久久精品一二三区 | 丝袜美腿在线播放 | h视频在线看| 天天综合色 | 天天色.com | 日本高清久久久 | 麻豆国产视频 | 国产在线精品一区二区 | 91在线视频观看 | 成人在线免费观看网站 | 国产成人免费高清 | 中文字幕人成一区 | 亚洲九九九 | 亚洲成人在线免费 | 国产视频欧美视频 | 五月天堂网 | 国产偷在线 | 日韩精品中文字幕在线不卡尤物 | 在线亚洲高清视频 | 国产一级精品在线观看 | av成人在线看 | 97网站| 91欧美日韩国产 | 五月婷婷激情综合 | 国产原创中文在线 | 国产精品99久久久精品免费观看 | 久久久久久蜜av免费网站 | 成人97人人超碰人人99 | 日韩网站在线 | 欧美激情第一区 | 国产精品一区在线播放 | 天天夜夜操 | 国产成人精品区 | 色综合亚洲精品激情狠狠 | 黄色一级免费 | 9热精品 | 91精品老司机久久一区啪 | 92精品国产成人观看免费 | 99精品电影 | 天天做日日爱夜夜爽 | 久99久精品 | 8x成人在线| 国产成人免费av电影 | 日韩高清www | 中文字幕一区二区三 | 激情综合网色播五月 | 菠萝菠萝在线精品视频 | 色综合www | 亚洲草视频 | 超碰公开在线 | 国产精品对白一区二区三区 | 久久国产精品久久国产精品 | 国产一区精品在线观看 | 日韩大片免费观看 | 亚洲欧美视频在线 | 最新国产精品亚洲 | 波多野结衣在线播放视频 | 日韩在线观看视频一区二区三区 | 亚洲欧美在线观看视频 | av7777777| 国产一区二区三区午夜 | 午夜电影中文字幕 | www.eeuss影院av撸 | 狠狠操狠狠干天天操 | 在线看片日韩 | 日韩a级黄色片 | 免费观看一级特黄欧美大片 | 精品资源在线 | 96亚洲精品久久 | 在线黄av| 久久久久久久久久久国产精品 | 欧美一进一出抽搐大尺度视频 | 色婷婷久久 | 免费观看黄色av | 五月天天在线 | 四虎成人精品永久免费av | 911在线| 91激情视频在线播放 | 国际av在线 | 久久国产手机看片 | 最新在线你懂的 | 日韩欧美一区二区不卡 | 波多野结衣亚洲一区二区 | 天天射天天做 | 精品在线99 | 成人黄色在线 | 四川妇女搡bbbb搡bbbb搡 | 国产精品久久久久久久久久久久午夜 | 国产日韩欧美在线观看 | 成年人在线免费看视频 | 国产一区二区观看 | 国产中文字幕三区 | 手机版av在线 | 亚洲va欧美va人人爽 | 啪啪午夜免费 | 国产精品扒开做爽爽的视频 | 一区二区三区电影在线播 | 91成人久久 | 国产精品资源 | 国产精品一区二区在线观看免费 | 国产三级精品在线 | 人人爱人人射 | 国产一区网| 国产精久久 | 日韩在线精品视频 | 贫乳av女优大全 | 国产呻吟在线 | 日日干夜夜草 | 91福利视频网站 | 在线观看激情av | 97免费中文视频在线观看 | 亚洲欧美乱综合图片区小说区 | 欧美久久久一区二区三区 | 欧美日韩国产精品久久 | 欧美 日韩 视频 | 日韩精品最新在线观看 | 狠狠色丁香婷婷综合视频 | 日一日操一操 | 亚洲午夜精品久久久久久久久 | 国产精品免费久久久久 | 天天射夜夜爽 | 黄色一级免费网站 | 三级av小说| 国产成人精品女人久久久 | 一区二区三区播放 | 欧美福利视频一区 | 国产欧美综合在线观看 | 久久婷婷一区二区三区 | 久久成人资源 | 激情伊人五月天 | 成人a视频片观看免费 | 永久免费看av| 黄色福利网站 | 99久久久国产精品免费99 | 国产精品一区电影 | 91传媒91久久久 | 成人av在线直播 | 日韩免费电影 | 最近最新最好看中文视频 | 日韩大陆欧美高清视频区 | 国产一区二区视频在线播放 | 国产精品69av| 毛片1000部免费看 | 久久国产亚洲精品 | 99久久日韩精品免费热麻豆美女 | 成人在线电影观看 | 久久99精品国产麻豆宅宅 | 日韩a在线 | 黄污网站在线 | 亚洲精品国产精品国产 | 久久久久久美女 | 在线成人观看 | 天天操人人干 | 狠狠干成人 | 婷婷干五月| 中文字幕文字幕一区二区 | 亚洲成a人片77777kkkk1在线观看 | 久久综合九色综合欧美就去吻 | 香蕉影视 | 国产精品欧美久久久久三级 | 国产婷婷色 | 99视频久| 亚洲精品欧洲精品 | 麻豆影视网 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 国产精品自产拍在线观看蜜 | 国产精品系列在线播放 | 亚洲精品国产自产拍在线观看 | 97超碰人人澡人人 | 黄色大片日本 | 五月激情六月丁香 | 欧美日韩一区二区三区不卡 | 91入口在线观看 | 欧美日韩在线视频免费 | 久久精品视频免费观看 | 欧亚日韩精品一区二区在线 | 成人亚洲精品久久久久 | 欧美精品一区在线 | 亚洲激情p| 亚洲.www | 久久综合中文色婷婷 | 99在线视频免费观看 | 欧美精选一区二区三区 | 日本视频网 | 在线观看亚洲电影 | 99久久久久久久 | 婷婷在线资源 | 人人看黄色 | 精品毛片一区二区免费看 | 日日弄天天弄美女bbbb | 中文字幕视频 | 500部大龄熟乱视频使用方法 | 国内精品中文字幕 | 天天综合色天天综合 | 免费黄色在线网址 | 日韩久久一区 | 国产一级不卡毛片 | 天堂av一区二区 | 国产免费作爱视频 | 日本女人b | 日本久久久久久科技有限公司 | 久久99精品久久只有精品 | 成人久久18免费网站 | 国产精品久久久久三级 | 欧美日本在线视频 | 久草在线视频看看 | 欧美男同视频网站 | 人人澡av | 黄色软件视频大全免费下载 | 最新91在线视频 | 亚洲国产精品电影在线观看 | 亚洲精品视频国产 | 亚洲在线不卡 | 免费91在线 | 狠狠狠狠狠狠狠 | 夜夜骑日日| 精品96久久久久久中文字幕无 | 99久久久久 | av中文字幕网站 | 97天天干 | a天堂一码二码专区 | 精品国精品自拍自在线 | 亚洲精品动漫久久久久 | 久草免费电影 | 日韩a在线看 | 五月综合久久 | 91麻豆精品一区二区三区 | www黄色av| 久久久久成人精品 | 91热爆视频| 国产日韩精品一区二区 | 欧美一区二区三区在线看 | 久久久久电影网站 | 日韩免费在线视频观看 | 五月激情电影 | 日韩网站免费观看 | 欧美成人猛片 | 亚洲va综合va国产va中文 | 九九热精品在线 | a视频免费看 | 精品国产自在精品国产精野外直播 | 亚洲精选在线 | 99久久er热在这里只有精品66 | 国产女人40精品一区毛片视频 | 久久国产网站 | 九九在线精品视频 | 韩日电影在线免费看 | 久久久亚洲麻豆日韩精品一区三区 | 欧美aaaxxxx做受视频 | 91亚洲网 | 最近的中文字幕大全免费版 | 91九色在线 | 精品久久精品久久 | 免费亚洲视频在线观看 | 欧洲成人av | 欧美视频国产视频 | 亚洲 精品在线视频 | 97超碰影视| 96av视频 | 97**国产露脸精品国产 | 蜜臀av夜夜澡人人爽人人 | 伊人久久精品久久亚洲一区 | 国产主播大尺度精品福利免费 | 国产中文欧美日韩在线 | 视频国产| 国产98色在线 | 日韩 | 久久五月婷婷丁香 | 黄色网在线免费观看 | 人人澡视频 | 黄色片视频在线观看 | 精品av在线播放 | 欧美成人影音 | 免费看片网站91 | 国产精品成人久久 | 国产成人免费在线 | 久久伦理电影网 | 亚洲精品国偷拍自产在线观看 | 999国产在线| 成人黄色电影在线 | 精品久久在线 | 欧美日韩在线免费观看 | 99久久精品国产一区 | 欧美成人理伦片 | 亚洲不卡av一区二区三区 | 黄色亚洲在线 | 国产一区二区午夜 | 碰超在线| 日本成人a| 国产91在线观 | 四虎国产精品成人免费4hu | 福利一区二区 | 亚洲精品国产拍在线 | 婷婷九月激情 | 亚洲麻豆精品 | 五月天com | 久久久久久久久国产 | 免费在线播放av电影 | 成人欧美一区二区三区在线观看 | aⅴ视频在线 | 久久第四色 | 91色在线观看视频 | 日韩xxxxxxxxx | 五月激情丁香婷婷 | 日韩在线观看影院 | 亚洲黄色免费在线看 | 国产精品大片免费观看 | 不卡av免费在线观看 | 欧美日韩另类在线 | 黄色a级片在线观看 | 色综合久久网 | 成人午夜精品福利免费 | 天天躁日日 | 欧美国产日韩在线视频 | 国产精品久久在线观看 | 久久超级碰视频 | 久久久久五月 | 国产精品毛片一区二区 | 国产精品麻豆99久久久久久 | 中文字幕在线视频国产 | 蜜桃视频色 | 一级电影免费在线观看 | 伊人官网| 国产资源在线视频 | 日韩午夜大片 | 最新色站 | 国产综合婷婷 | 97在线看片 | 国产精品久久久久久久久大全 | 久久久99精品免费观看 | av电影在线不卡 | 国产最顶级的黄色片在线免费观看 | 色资源中文字幕 | 美女视频久久 | 欧美激情综合色 | 国产精品资源 | 黄色亚洲大片免费在线观看 | 国产原厂视频在线观看 | 999超碰 | 久久国产精品精品国产色婷婷 | 99在线精品观看 | 欧美日韩午夜爽爽 | 国产一级在线免费观看 | 一级黄色电影网站 | 最近乱久中文字幕 | 精品中文字幕在线观看 | 亚洲色影爱久久精品 | 国产精品一区在线 | 激情综合电影网 | 一区二区三区动漫 | 国产一二三四在线观看视频 | 国产91在线播放 | 九九亚洲精品 | 日本中文在线播放 | 69视频国产 | 久久精品站 | 欧美男男tv网站 | 国产视频一区二区在线 | 人人爱人人添 | 成人在线网站观看 | 亚洲经典在线 | 一级片观看| 99久久精品免费看国产四区 | 91色亚洲 | 亚洲少妇自拍 | 免费观看性生交大片3 | 在线综合 亚洲 欧美在线视频 | 狠狠gao| 国产在线 一区二区三区 | 亚洲成人黄色在线 | 国产高清av免费在线观看 | 中文字幕乱在线伦视频中文字幕乱码在线 | 天天摸天天舔天天操 | 色五月激情五月 | 三三级黄色片之日韩 | 日韩视频免费播放 | 精品av网站 | 91色欧美| 中文字幕在线播放日韩 | 伊人婷婷久久 | 国产九九精品视频 | 亚洲欧美日韩中文在线 | 日日干夜夜操视频 | 十八岁免进欧美 | 97超碰色偷偷 | 国产精品久久久久久久久久白浆 | 天天操天天色综合 | 欧美日本三级 | 激情综合网五月婷婷 | 欧美一区二区在线看 | 欧美一级片在线播放 | 又黄又爽又无遮挡免费的网站 | 丁香六月婷婷开心婷婷网 | 久久午夜国产 | 国产精品原创在线 | 免费看污在线观看 | 美腿丝袜一区二区三区 | 久久av免费电影 | 欧美极品在线播放 | 久久久午夜电影 | 9999激情| 中文字幕一区二区三区久久蜜桃 | 五月天色中色 | 亚洲日本在线一区 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 美女视频久久久 | 日韩在线不卡av | 人人射人人爱 | 91久久精品一区 | 九九热在线观看视频 | 久久久久欠精品国产毛片国产毛生 | 亚洲天堂视频在线 | 日日夜夜人人精品 | 欧美国产日韩一区二区三区 | 久久精品国产精品亚洲 | 麻豆久久久 | 看全黄大色黄大片 | 欧美另类xxxx| 午夜精品电影 | 亚洲精品av在线 | 久久综合九色综合网站 | 伊人小视频 | 九九视频免费 | 国产123区在线观看 国产精品麻豆91 | 99这里只有精品视频 | 国产美女视频网站 | 国产婷婷色 | 91精品在线视频观看 | 午夜少妇一区二区三区 | 99色免费视频 | 水蜜桃亚洲一二三四在线 | 欧美日韩高清在线观看 | 亚洲国产精品成人女人久久 | 中文字幕在线观看完整 | 97视频在线观看成人 | 四川妇女搡bbbb搡bbbb搡 | 亚洲激色 | 亚洲国产精品资源 | 久久视频免费在线 | 亚洲国产片色 | 91成人网在线观看 | 人人狠| 91大神在线看 | 在线中文字幕av观看 | 国产小视频在线 | 一区二区三区四区五区六区 | 精品在线观 | 狠狠色丁香婷婷综合视频 | 天天操偷偷干 | 91麻豆精品国产91久久久久久久久 | 国产二区电影 | 丁香婷婷电影 | 99久久精品网 | 亚洲第一伊人 | 亚洲精品视频中文字幕 | 噜噜色官网 | 综合影视| 中文字幕一区二区三 | www.久久久com | 亚洲精品国产区 | 久久超碰网 | 在线小视频 | 2000xxx影视| 亚洲码国产日韩欧美高潮在线播放 | 久久精品波多野结衣 | 色丁香色婷婷 | 亚洲天堂色婷婷 | 成人九九视频 | 国产精品123| 狠狠躁夜夜躁人人爽视频 | 国产一区免费在线 | 大型av综合网站 | 国产精品久久久久久高潮 | 超碰在97 | 久久超碰99| 区一区二区三区中文字幕 | 国产精品久久久久久久久久久免费 | 日韩激情片在线观看 | 日韩免费在线 | 97视频成人| 国产美女精品视频 | 免费久久片 | 欧美日韩中文在线观看 | 欧美美女视频在线观看 | 成片视频在线观看 | 激情影音先锋 | 欧美a级在线播放 | 欧美日韩不卡在线视频 | 久亚洲精品 | 黄色在线观看www | 91色欧美| 国产1区在线 | 久草在线免费看视频 | se婷婷 | 久久久久色 | 天天色播 | av亚洲产国偷v产偷v自拍小说 | 日韩精品一卡 | 奇米网444| 中文字幕在线不卡国产视频 | 欧美激情综合色综合啪啪五月 | 波多野结衣精品在线 | 欧美精品视 | 久久精品视频国产 | 国产一级免费av | 国产传媒一区在线 | 日韩精品久久久久久中文字幕8 | 一级性av | 婷婷电影在线观看 | 9999激情| 国内精品久久久久影院日本资源 | 日韩av进入 | 国产一卡二卡在线 | 欧美成亚洲 | 在线观看一级片 | 日韩精品一区二区三区高清免费 | 成人免费视频网 | 天天干夜夜擦 | 成 人 a v天堂| 日韩狠狠操 | 久久老司机精品视频 | 少妇bbw搡bbbb搡bbbb | 香蕉视频国产在线 | 五月婷婷精品 | 97色狠狠 | 久久久久免费精品 | 久久久久国产视频 | www.狠狠色 | 在线只有精品 | 久久久国产精品人人片99精片欧美一 | 在线观看91精品国产网站 | 黄色小说在线免费观看 | 99久久精品免费视频 | 天天天天爽 | 天天干一干 | 中文字幕在线久一本久 | 国产精品久久久久国产精品日日 | 亚洲成av片人久久久 | 婷婷久久一区二区三区 | 亚洲欧美国产精品久久久久 | 成人av一级片 | 国内精品视频久久 | 欧洲精品视频一区二区 | 天天插天天狠天天透 | 超碰97在线人人 | 2019中文在线观看 | 天天插视频 | 成人av电影在线观看 | 免费成人在线视频网站 | 青青草华人在线视频 | 久草国产在线观看 | 国产精品欧美一区二区 | 成人黄色大片在线观看 | 亚洲精品中文字幕视频 | 国内精品久久久久影院男同志 | 亚洲欧洲精品一区 | 婷婷播播网 | 999久久国精品免费观看网站 | 国产精品久久嫩一区二区免费 | 欧美一级艳片视频免费观看 | 精品国内自产拍在线观看视频 | 中文字幕av有码 | 免费网址在线播放 | 国产精品久久久久久999 | 99久久精品无码一区二区毛片 | 97视频亚洲 | av免费看av | 2019中文字幕网站 | 国产精品久久在线观看 | 日p在线观看 | 日韩激情久久 | 18pao国产成视频永久免费 | 国产精品成人一区二区三区 | 精品在线观看视频 | 在线观看亚洲国产精品 | 欧美日韩在线播放 | 国产精品观看视频 | 久草在线久草在线2 | 欧美黑人猛交 | 91丨九色丨高潮丰满 | 国产精品一区二区久久 | 日韩中文字幕免费视频 | 精品国产一区二区三区免费 | 美女免费黄网站 | 少妇性色午夜淫片aaaze | 亚洲国内精品 | 六月婷色| 欧美精品乱码久久久久久按摩 | 日本电影黄色 | 日日噜噜噜噜夜夜爽亚洲精品 | 午夜av在线播放 | 黄色网址国产 | 免费观看一级 | 亚洲精品免费播放 | 久草97| 在线观看日韩一区 | 天天干,天天射,天天操,天天摸 | 丁香六月天婷婷 | 五月综合色婷婷 | ww视频在线观看 | 日韩电影中文字幕在线观看 | 又色又爽又黄 | 91亚色视频 | 玖玖玖在线观看 | 伊人黄色网 | 麻豆视频免费版 | 美女在线观看av | 五月婷网站 | 99久久精品免费视频 | 日本女人的性生活视频 | 欧美日韩在线看 | 欧美最猛性xxxxx亚洲精品 | 狠狠躁天天躁综合网 | 国产日韩精品一区二区三区 | 久草精品免费 | 99婷婷狠狠成为人免费视频 | 六月色 | 久久r精品 | 亚洲高清在线精品 | 久久久久久免费 | 黄色一级免费 | 国产精品自产拍在线观看 | 一区电影 | 狠狠干婷婷色 | 日韩一级网站 | 亚洲激情五月 | 国内成人精品2018免费看 | 午夜狠狠干 | 97香蕉久久超级碰碰高清版 | 免费a现在观看 | 草草草影院 | 国产拍在线 | 久久国产成人午夜av影院潦草 | 在线观看亚洲精品 | 久久国产精品一区二区三区四区 | 精品一区二区免费在线观看 | 91九色综合 | 国产亚洲精品久久网站 | 日韩精品免费在线视频 | 91看片黄色| 久久黄色网址 | 黄色激情网址 | 精品视频网站 | 国产麻豆成人传媒免费观看 | 免费亚洲片 | 日韩高清精品一区二区 | 黄色成年片 | 久久久久国产一区二区三区四区 | 亚洲成a人片综合在线 | 久久久99精品免费观看app | 一 级 黄 色 片免费看的 | 国产精品亚洲片夜色在线 | 黄色成品视频 | 91精品视频免费 | 久久公开免费视频 | 97在线免费 | 中文字幕在线电影 | 这里只有精品视频在线观看 | www婷婷| 国产色视频一区二区三区qq号 | 国产99久久久国产精品免费二区 | 中文字幕在线观看你懂的 | 久99视频| 波多野结衣一区二区三区中文字幕 | 欧美analxxxx | av韩国在线| 91色综合| 在线性视频日韩欧美 | 91高清完整版在线观看 | 欧洲精品码一区二区三区免费看 | 久久狠狠亚洲综合 | 久久久久久麻豆 | 久艹视频在线观看 | 人人揉人人揉人人揉人人揉97 | 亚洲艳情| 人人cao| 国产一区二区精品在线 | 亚洲综合射 | 黄色影院在线免费观看 | 免费看一及片 | 精品国产一区二区三区久久久 | 少妇性aaaaaaaaa视频 | 国产无套精品久久久久久 | 人人揉人人揉人人揉人人揉97 | 日韩精品视频一二三 | 国内精品在线一区 | 日韩电影在线观看一区二区三区 | 视频二区在线视频 | 99精品久久久久久久 | 激情综合网在线观看 | 色久五月 | 黄色视屏免费在线观看 | 天天射综合网站 | 久久久久久久久毛片精品 | a极黄色片 | 人人搞人人搞 | 最新av电影网址 | 超碰在线最新地址 | 精品国产电影一区 | 国产青春久久久国产毛片 | 欧美极度另类性三渗透 | 国产精品午夜在线 | 丁香五月亚洲综合在线 | 亚洲另类视频在线观看 | 国产一级片网站 | 久久久久欧美精品999 | 午夜影院在线观看18 | av大片免费看 | 六月婷色 | 91热这里只有精品 | 超碰公开在线观看 | 久久er99热精品一区二区三区 | 日韩乱码在线 | 国产在线第三页 | 天天操天天射天天爱 | 色婷婷福利视频 | 成人中文字幕在线 | 国产成人精品a | 夜夜嗨av色一区二区不卡 | 中文字幕高清免费日韩视频在线 | www国产亚洲精品久久网站 | 日韩av成人 | 国产精品乱码一区二区视频 | 91人人澡人人爽人人精品 | 国产一二三精品 | 91精品国产网站 | 日韩在线观看视频在线 | 久久久久久福利 | 精品国产理论 | 日韩色爱 | 欧美成人999 | 99精品欧美一区二区 | 国产一级视频在线 | 中文字幕有码在线观看 | 91电影福利| 国产综合精品久久 | 97精品久久人人爽人人爽 | 国产日产精品一区二区三区四区的观看方式 | 99久久精品视频免费 | 久久精品综合 | 亚洲dvd| 国产精品日韩欧美一区二区 | 91av片| 国产一区二区三区 在线 | 精品9999 | 96久久| 中文字幕一区二区三区四区久久 | 国产亚洲久一区二区 | 91重口视频| 色五月色开心色婷婷色丁香 | 人人舔人人插 | 国产又粗又猛又黄又爽视频 | 99精品国产一区二区三区麻豆 | 久草久| 成人精品久久久 | 国产精品日韩在线播放 | 中文字幕a在线 | 最近中文字幕久久 | 成人app在线播放 | 亚洲精品国产精品乱码不99热 | 久久久久成人精品亚洲国产 | 中文字幕在线播放第一页 | 国产日韩欧美自拍 | 黄色大全免费观看 | 日日麻批40分钟视频免费观看 | 国产精品久久久久av福利动漫 | 日本夜夜草视频网站 | 婷婷精品在线视频 | 成人禁用看黄a在线 | 国内精品免费 | 中文字幕区 | 国产夫妻自拍av | 狠狠色香婷婷久久亚洲精品 | 精品91在线 | 亚洲激情网站免费观看 | 亚洲视频一区二区三区在线观看 | 黄影院| 久草视频免费在线观看 | 99精品在线看 | 日日天天干 | 97超碰人人澡 | 福利一区二区三区四区 | av资源中文字幕 | 欧美精品你懂的 | 深夜免费福利在线 | 国产午夜免费视频 | 国产一区二区播放 | 狠狠色丁香婷婷综合久久片 | 久久久久久国产精品久久 | 91在线视频免费91 | 五月婷婷综合在线观看 | 91精品视频在线播放 | 香蕉视频网站在线观看 | 97人人爽人人 | 国产v在线播放 | 精品国产_亚洲人成在线 | 黄色大片网 | 99婷婷狠狠成为人免费视频 | 99久久这里有精品 | 久久久久久久久久久福利 | 欧美老少交 | 国精产品999国精产 久久久久 | 成人在线免费av | 青青河边草观看完整版高清 | 丁香视频五月 | 99婷婷| 亚洲一区二区三区毛片 | 中文字幕视频免费观看 | 99精品热视频只有精品10 | 一区二区欧美在线观看 | 亚洲国产精品va在线看黑人动漫 | www.香蕉视频 | 麻豆成人在线观看 | 在线视频一二区 | 国产免费中文字幕 | 日韩欧美亚州 | 麻豆影视网| 日日爱网站| 五月激情片 | 成人a v视频 | 天天操综 | 97色综合| 丁香花五月| 99热精品免费观看 | 亚洲视频在线观看 |