分享
 
 
 

C++对象模型之数据成员模型(1)

王朝c/c++·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

第二章 数据成员模型

1.1. 继承与数据成员

考察下面的例子:

0001 class Concrete1

0002 {

0003 public :

0004 int val;

0005 char bit1;

0006 };

0007 class Concrete2 : public Concrete1

0008 {

0009 public :

0010 char bit2;

0011 };

0012 class Concrete3 : public Concrete2

0013 {

0014 public :

0015 char bit3;

0016 };

类继承关系如下:

Concrete1

Concrete2

Concrete3

正确的对象内存布局

Concrete1 Object Concrete2 Object Concrete3 Object

4

int val

1

char bit1

3

Padding 3 bytes

8

Concrete1

1

char bit2

3

Padding 3 bytes

12

Concrete2

1

char bit3

3

Padding 3 bytes

验证对象

0001 #include <iostream>

0002 //-------------------------------------------------------------------

0003 class Concrete1

0004 {

0005 public :

0006 int val;

0007 char bit1;

0008 };

0009 class Concrete2 : public Concrete1

0010 {

0011 public :

0012 char bit2;

0013 };

0014 class Concrete3 : public Concrete2

0015 {

0016 public :

0017 char bit3;

0018 };

0019 //-------------------------------------------------------------------

0020 int main()

0021 {

0022 cout << sizeof(Concrete1) << endl;

0023 cout << sizeof(Concrete2) << endl;

0024 cout << sizeof(Concrete3) << endl;

0025 int i;

0026 cin >> i;

0027 }

输出结果为:

8

12

16

从以上模型结构可以看出,子类继承了父类的数据,同时也继承了父类因补齐原则而引入的“多余的”字节。为什么在子类继承的同时不去除父类因补齐原则而引入的“多余的”字节呢?为什么不将模型转换成如下形式,以便更加节约内存,减少因类继承关系而造成的对象内存空间的浪费呢?

Concrete1 Object Concrete2 Object Concrete3 Object

4

int val

1

char bit1

3

Padding 3 bytes

4

int val

1

char bit1

1

char bit2

2

Padding 2 bytes

4

int val

1

char bit1

1

char bit2

1

char bit3

1

Padding 1 bytes

如此一来,三个对象的内存占用大小都变成8个字节,因而在创建多个派生类对象的时候,将更节约内存。

之所以不采用这样的模型,是因为该模型会在复制对象的时候产生不可预期的错误,例如:

0001 Concrete2 *pc2;

0002 Concrete1 *pc1;

0003 pc2 = new Concrete2;

0004 pc1 = new Concrete1;

0005 *pc2 = *pc1;

上述模型模型将在第五行产生不可预期的错误,这是因为复制Concrete1对象的时候会破坏Concrete2对象的数据成员。

bit2将被指定一个不确定的值,破环了原来的数据内容,这种行为不是所期望的。

Concrete1 Object Concrete2 Object

4

int val

1

char bit1

3

Padding 3 bytes

4

int val

1

char bit1

1

char bit2

2

Padding 2 bytes

Copy

同理,Concrete1 ---> Concrete2,Concrete2 -à Concrete3也都会破坏数据成员。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有