亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

淺談C++中派生類對象的內存布局

2020-01-26 14:21:24
字體:
來源:轉載
供稿:網友

主要從三個方面來講:

  1 單一繼承

  2 多重繼承

  3 虛擬繼承

1 單一繼承

(1)派生類完全擁有基類的內存布局,并保證其完整性。

派生類可以看作是完整的基類的Object再加上派生類自己的Object。如果基類中沒有虛成員函數,那么派生類與具有相同功能的非派生類將不帶來任何性能上的差異。另外,一定要保證基類的完整性。實際內存布局由編譯器自己決定,VS里,把虛指針放在最前邊,接著是基類的Object,最后是派生類自己的object。舉個栗子:

class A{  int b;  char c;};class A1 :public A{    char a;};int main(){  cout << sizeof(A) << " " << sizeof(A1) << endl;  return 0;}

輸出是什么?

答案:

8 12

A類的話,一個int,一個char,5B,內存對齊一下,8B。A1的話,一個int,兩個char,內存對齊一下,也是8B。不對嗎?

我說了,要保證基類對象的完整性。那么一定要保證A1類前面的幾個字節一定要與A類完全一樣。也就是說,A類作為內存補齊的3個字節也是要出現在A1里面的。也就是說,A類是這樣的:int(4B)+char(1B)+padding(3B)=8B,A1類:int(4B)+char(1B)+padding(3B)+char(1B)+padding(3B)=12B。

(2)虛指針怎么處理?

還是視編譯器而定,VS是永遠把vptr放在對象的最前邊。如果基類中含有虛函數,那么處理情況與上邊一樣。可是,如果基類中沒有虛函數而派生類有的話,那么如果把vptr放在派生類的前邊的話,將會導致派生類中基類成分并不在最前邊。這將帶來什么問題呢?舉栗:假設A不含虛,而A1含。

A *pA;A1 obj_A1;pA=&obj_A1;

如果A1完全包含A并且A位于A1的最前邊,那么編譯器只需要把&obj_A1直接賦給pA就可以了。如果不是呢?編譯器就需要把&obj_A1+sizeof(vptr)賦給pA了。

2 多重繼承

說結論:VS的內存布局是按照聲明順序排列內存。再舉個栗子:

class point2d{public:  virtual ~point2d(){};  float x;  float y;};class point3d :public point2d{  ~point3d(){};  float z;};class vertex{public:  virtual ~vertex(){};  vertex* next;};class vertex3d :public point3d, public vertex{  float bulabula;};int _tmain(int argc, _TCHAR* argv[]){  cout << sizeof(point2d) << " " << sizeof(point3d) << " " << sizeof(vertex) << " " << sizeof(vertex3d) << endl;  return 0;}

輸出: 12 16 8 24。

內存布局:

point2d: vptr(4)+x(4)+y(4)=12B

point3d: vptr+x+y+z=16B

vertex: vptr+next=8B

vertex3d: vptr+x+y+z+vptr+next+bulabula=28B

為什么需要多個虛指針?請往下看。

3 虛擬繼承

(1)為什么要有“虛繼承”這樣的機制?

簡單講,虛繼承是為也防止“diamond”繼承所帶來的問題。也就是類A1、A2都繼承于A,類B又同時繼承于A1、A2。這樣一來,類B中就有兩份類A的成員了,這樣的程序無法通過編譯。我們改成這樣的形式:

class A{public:  int a;  virtual ~A();   virtual void fun(){cout<<"A"<<endl;}};class A1 :public virtual A{public:  int a1;  virtual void fun(){cout<<"A1"<<endl;}};class A2 :public virtual A{public:  int a2;  virtual void fun(){cout<<"A2"<<endl;}}; class B :public A1,public A2 {public:  int b;  virtual void fun(){cout<<"B"<<endl;}  virtual void funB(){};};

這樣就能防止這樣的事情發生。

(2)虛擬繼承與普通繼承的區別:

普通繼承使得派生類每繼承一個基類便擁有一份基類的成員。而虛擬繼承會把通過虛擬繼承的那一部分,放在對象的最后。從而使得只擁有一份基類中的成員。虛擬對象的偏移量被保存在Derived類的vtbl的this指向的上一個slot。比較難理解。下面我給你個栗子。

(3)虛擬繼承的內存布局:

每個派生類會把其不變部分放在前面,共享部分放在后面。

上面四個類的大小是怎樣的呢?

int _tmain(int argc, _TCHAR* argv[]){  cout << sizeof(A) << " " << sizeof(A1) << " " << sizeof(A2) << " " << sizeof(B) << endl;  return 0;}

輸出:8 16 16 28

內存布局:

    A: vptr+a=8B

    A1: vptr+a1+vptrA+a=16B

    A2: vptr+a2+vptrA+a=16B

    A3: vptr+a1+vptrA2+a2+b+vptrA+a=28B

上個草圖:

那究竟為什么需要多個虛指針?將對象內存布局和虛表結構搞清楚之后,答案是不是呼之欲出呢?

是的,因為這樣可以保證在將子類指針/引用轉換成基類指針時編譯器可以直接根據對像的內存布局進行偏移,從而使得指向的第一個內容為虛指針,進而實現多態(根據靜態類型執行相應動作)。

以上就是小編為大家帶來的淺談C++中派生類對象的內存布局全部內容了,希望大家多多支持武林網~

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩一区二区三区国产| 欧美成人一区二区三区电影| 中文字幕在线看视频国产欧美| 91在线色戒在线| 97在线视频一区| 久久久久久久一区二区三区| 久久久久亚洲精品成人网小说| 欧美极度另类性三渗透| 亚洲**2019国产| 国产91精品青草社区| 国产欧美日韩高清| 深夜成人在线观看| 久久精品视频中文字幕| 色偷偷偷亚洲综合网另类| 亚洲最大福利网| 久久精品亚洲94久久精品| 久精品免费视频| 最近2019中文字幕mv免费看| 青青草国产精品一区二区| www.色综合| 亚洲国产精品va在线观看黑人| 久久成人这里只有精品| 国产91精品青草社区| 大荫蒂欧美视频另类xxxx| 久久综合久中文字幕青草| 亚洲视频电影图片偷拍一区| 尤物九九久久国产精品的分类| 久久久久中文字幕2018| 国产日本欧美一区二区三区在线| 色综合久久久888| 国产精品自产拍在线观看中文| 欧美综合国产精品久久丁香| 亚洲久久久久久久久久| 亚洲欧洲高清在线| 成人中心免费视频| 精品国产拍在线观看| 日本一区二区三区在线播放| 日韩激情在线视频| 91精品综合久久久久久五月天| 亚洲精品久久久久中文字幕欢迎你| 狠狠色香婷婷久久亚洲精品| 欧美成人亚洲成人| 亚洲视频在线观看网站| 综合av色偷偷网| 欧美成人第一页| 亚洲天堂免费视频| 97色在线播放视频| 亚洲少妇激情视频| 91精品视频在线播放| 亚洲免费影视第一页| 久久久久女教师免费一区| 久久69精品久久久久久久电影好| 亚洲欧美国产精品久久久久久久| 亚洲毛茸茸少妇高潮呻吟| 亚洲r级在线观看| 久久免费国产精品1| 亚洲国产精品99久久| 8050国产精品久久久久久| 日本欧美爱爱爱| 日本三级韩国三级久久| 精品成人av一区| 日本精品视频在线| 亚洲国产成人精品久久| 上原亚衣av一区二区三区| 日本精品免费一区二区三区| 日韩av在线一区二区| 亚洲精品美女久久久久| 午夜精品理论片| 精品国产一区二区三区久久| 欧美裸体xxxxx| 91精品成人久久| 国产精品视频公开费视频| 久久免费视频在线观看| 亚洲人成伊人成综合网久久久| 亚洲人成网站在线播| 岛国av一区二区在线在线观看| 亚洲精品动漫久久久久| 久久久之久亚州精品露出| 亚洲一级免费视频| 人妖精品videosex性欧美| 欧美日韩国产中文字幕| 成人精品视频久久久久| 久久久亚洲影院你懂的| 亚洲国产天堂久久综合| 精品无人国产偷自产在线| 色偷偷91综合久久噜噜| 精品久久久久久久大神国产| 日韩精品中文字| 一本久久综合亚洲鲁鲁| 91视频国产精品| 欧美精品久久久久| 亚洲欧美日韩在线一区| 亚洲精品自在久久| 超在线视频97| 国产91精品最新在线播放| 中文字幕久久久| 亚洲护士老师的毛茸茸最新章节| 91精品国产综合久久男男| 国产丝袜一区二区| 91精品免费久久久久久久久| 日韩av手机在线看| 欧美性猛交xxxx乱大交蜜桃| 成人黄色免费看| 91精品中文在线| 欧美丝袜第一区| 国产精品爱啪在线线免费观看| 97精品伊人久久久大香线蕉| 97免费视频在线播放| 欧美在线一区二区三区四| 欧美激情欧美激情在线五月| 日韩一区二区在线视频| 久久久久久噜噜噜久久久精品| 亚洲天堂网站在线观看视频| 精品毛片网大全| 亚洲欧美另类自拍| 91系列在线观看| 日韩中文字幕欧美| 91av在线精品| 欧美日韩亚洲高清| 久久99精品久久久久久噜噜| 成人性教育视频在线观看| 亚洲午夜性刺激影院| 国产精品国内视频| 欧美黑人巨大精品一区二区| 成人久久18免费网站图片| 日韩精品福利在线| 精品国产一区二区三区久久狼5月| 久久精品精品电影网| 国产精品亚洲一区二区三区| www.亚洲一区| 欧美大尺度在线观看| 亚洲福利小视频| 欧美不卡视频一区发布| 欧美另类老肥妇| 亚洲美女在线视频| 欧美在线视频观看免费网站| 激情成人在线视频| 国外成人免费在线播放| 亚洲欧美日韩久久久久久| 日韩va亚洲va欧洲va国产| 最近2019年中文视频免费在线观看| 日韩在线精品一区| 疯狂做受xxxx高潮欧美日本| 亚洲综合日韩中文字幕v在线| 欧美性生活大片免费观看网址| 中文字幕日韩在线播放| 亚洲欧美日韩一区二区在线| 午夜精品一区二区三区在线| 国产精品入口福利| 国产一区二区三区在线视频| 狠狠躁夜夜躁久久躁别揉| 日本高清不卡的在线| 97视频在线观看视频免费视频| 亚洲精品99久久久久中文字幕| 亚洲精品在线观看www| 久久青草精品视频免费观看| 国产精品爽黄69| 九九热这里只有在线精品视| 欧美午夜电影在线| 色与欲影视天天看综合网| 亚洲第一区在线观看| 91久久综合亚洲鲁鲁五月天| 亚洲精品网站在线播放gif| 欧美中文字幕在线视频|