开始前先看看
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的需要。
成员数据的绑定
时间: 2024-11-08 20:28:52