码迷,mamicode.com
首页 > 编程语言 > 详细

c++对象模型研究3:数据

时间:2016-06-16 14:38:09      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

开始前先看看

class X {};
class Y:public virtual X {};
class Z:public virtual X {};
class A:public Y,public Z {};

上述X,Y,Z,A中没有任何一个class内含明显的数据,其间只表示了继承关系。

按照书上的例子

sizeof X = 1
sizeof Y = 8
sizeof Z = 8
sizeof A = 12

译注是

sizeof X = 1
sizeof Y = 4
sizeof Z = 4
sizeof A = 8

先看X,事实上并不是空的,编译器会安插进去一个char。使得这个class的对象在内存中配置独一无二的地址。

至于Y和Z受到三个因素的影响:

1.语言本身所造成的额外负担。其实就是之前一直说的virtual问题。

2.编译器对于特殊情况所提供的优化处理。有些编译器会对这个1bytes作出不同的处理(例如省略)。

3.Alignment的限制,我的理解是字节对齐,在大部分机器上,群聚的结构体大小会受到alignment的限制,使它们能够更有效率地在内存中被存取。


ps:一个虚基类对象只会在派生类中存在一份实体,不管它在class继承体系中出现了多少次。


C++对象模型尽量以空间优化和存取速度优化的考虑来表现非static成员数据,并且保持和C语言struct数据配置的兼容性。它把数据直接存放在每一个类对象之中。对于继承而来的非static成员数据(不管是virtual还是非virtual基类)也是如此。而类的static成员数据是存放在全局中,只有一份实例(甚至即使该class没有任何对象实体,其static成员数据也已存在),但是一个template类的static成员数据的行为稍有不同。


每一个类对象必须有足够的大小以容纳它所有的非static成员数据,它可能比你想象的还大,原因是:

1.由编译器自动加上的额外成员数据,用以支持某些语言特性(主要是各种virtual特性)。

2.因为alignment的需要。

成员数据的绑定





c++对象模型研究3:数据

标签:

原文地址:http://blog.csdn.net/losophy/article/details/51689930

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!