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

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

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

2020-05-23 13:57:35
字體:
來源:轉載
供稿:網友

主要從三個方面來講:

  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++

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

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

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国内精品国产三级国产在线专| 国产亚洲精品激情久久| 国产精品日韩在线一区| 亚洲护士老师的毛茸茸最新章节| 日韩美女免费观看| 日韩中文在线不卡| 欧美中文字幕第一页| 国产精品1区2区在线观看| 亚洲第一区第一页| 疯狂做受xxxx高潮欧美日本| 日韩高清电影好看的电视剧电影| 一道本无吗dⅴd在线播放一区| 国产精品视频一| 亚洲午夜未删减在线观看| 97**国产露脸精品国产| 欧美激情久久久| 九九视频直播综合网| 日韩中文字幕网站| 亚洲欧美日本另类| 国产经典一区二区| 国内精品久久久久| 亚洲日本中文字幕免费在线不卡| 亚洲成色777777女色窝| 欧美高清视频一区二区| 日韩国产高清视频在线| 97精品国产91久久久久久| 国产成人一区三区| 日韩欧美国产免费播放| 最新日韩中文字幕| 日韩精品视频免费专区在线播放| 97国产精品久久| 国产精品影片在线观看| 亚州欧美日韩中文视频| 亚洲欧洲自拍偷拍| 九九热最新视频//这里只有精品| 91老司机精品视频| 岛国精品视频在线播放| 国产亚洲aⅴaaaaaa毛片| 69视频在线免费观看| 国产精品爱久久久久久久| 久久久中精品2020中文| 中文字幕欧美精品日韩中文字幕| 日韩在线视频线视频免费网站| 成人免费xxxxx在线观看| 视频直播国产精品| 中文字幕国产亚洲| 亚洲福利视频二区| 中文字幕国产亚洲2019| 日韩精品一区二区三区第95| 精品中文字幕乱| 亚洲香蕉成人av网站在线观看| 亚洲欧美日韩国产精品| 日韩免费观看av| 97在线视频观看| 97超级碰碰碰| 国产精品男人爽免费视频1| 深夜精品寂寞黄网站在线观看| 亚洲综合成人婷婷小说| 国产原创欧美精品| 亚洲午夜精品久久久久久久久久久久| 久久91亚洲精品中文字幕奶水| 欧美自拍视频在线观看| 成人网中文字幕| 欧美精品在线视频观看| 亚洲国产成人爱av在线播放| 国产精品爽爽爽| 一区二区欧美在线| 亚洲黄色av女优在线观看| 欧美色视频日本版| 热99在线视频| 国产精品久久久久福利| 国产丝袜精品第一页| 亚洲激情国产精品| 国产一区香蕉久久| 成人有码视频在线播放| 亚洲福利精品在线| 久久99久久久久久久噜噜| 国产精品久久久久7777婷婷| 萌白酱国产一区二区| 色婷婷av一区二区三区在线观看| 97免费中文视频在线观看| 日韩有码片在线观看| 国产精品夜间视频香蕉| 日韩福利视频在线观看| 久久精品亚洲94久久精品| 亚洲成人a级网| 国产精品久久久久久久久久久久久| 国产精品1234| 欧美在线影院在线视频| 国产精品成人一区二区三区吃奶| 国产精品入口日韩视频大尺度| 国产精品视频99| 亚洲精品一区在线观看香蕉| 亚洲天堂成人在线| 久久久免费精品视频| 成人在线视频福利| 中文字幕成人在线| 色综合导航网站| 亚洲激情小视频| 日韩暖暖在线视频| 亚洲欧美国内爽妇网| 欧美一区二区三区精品电影| 国产精品1区2区在线观看| 精品国产乱码久久久久久虫虫漫画| 欧美小视频在线| 日韩美女视频中文字幕| 国产美女精彩久久| 2019亚洲男人天堂| 亚洲色图15p| 国产在线久久久| 91深夜福利视频| 秋霞av国产精品一区| 亚洲高清在线观看| 伊人伊成久久人综合网小说| 亚洲午夜未满十八勿入免费观看全集| 欧美激情中文字幕乱码免费| 亚洲国产日韩欧美在线99| 亚洲国产精品热久久| 在线视频精品一| 久久亚洲春色中文字幕| 欧美性色视频在线| 97精品欧美一区二区三区| 啊v视频在线一区二区三区| 精品香蕉在线观看视频一| 亚洲精品资源在线| 亚洲级视频在线观看免费1级| 亚洲国产成人久久| 国产精品尤物福利片在线观看| 久久精品影视伊人网| 7777kkkk成人观看| 成人网页在线免费观看| 国产aⅴ夜夜欢一区二区三区| 欧美国产日韩一区| 精品中文字幕在线观看| 国产噜噜噜噜噜久久久久久久久| 欧美国产在线电影| 久久国产精品影视| 日韩精品中文字幕久久臀| 懂色aⅴ精品一区二区三区蜜月| 欧美激情精品久久久久久| 在线精品视频视频中文字幕| 国产日韩视频在线观看| 亚洲片国产一区一级在线观看| 国产欧美日韩中文字幕在线| 亚洲免费视频一区二区| 日韩国产精品亚洲а∨天堂免| 国产亚洲精品91在线| 欧美精品久久久久久久| 亚洲美女又黄又爽在线观看| 亚洲精品免费在线视频| 欧美最顶级的aⅴ艳星| 成人在线小视频| 亚洲欧美日韩网| 97国产精品视频人人做人人爱| 亚洲欧美日韩爽爽影院| 精品国产美女在线| 亚洲第一页在线| 激情成人在线视频| 亚洲缚视频在线观看| 国产精品主播视频| 久久精品在线播放| 美女999久久久精品视频| 国产精品va在线| 国产午夜精品视频免费不卡69堂|