类的大小。。。

发布时间:2016-12-7 1:50:25 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"类的大小。。。",主要涉及到类的大小。。。方面的内容,对于类的大小。。。感兴趣的同学可以参考一下。

class X{}; class Y:public virtual X{}; class Z:public virtual X{}; class A:public Y,public Z{};     sizeof    X:1  Y:4 Z:4 A:8   类的实例化,所谓类的实例化就是在内存中分配一块地址,每个实例在内存中都有独一无二的地址。同样空类也会被实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有了独一无二的地址了。所以空类的sizeof为1。   Y和Z的大小受到三个因素的影响: 1、语言本身所造成的额外负担(overhead): 当语言支持virtual base classes时,就会导致一些额外负担。在derived class中,这个额外负担反映在某种形式的指针身上,它或者指向virtual base class subobject,或者指向一个相关表格:表格中存放的若不是virtual base class subobject的地址,就是其偏移量(offset, 这正是VC++的做法)。 2、编译器对于特殊情况所提供的优化处理:Virtual base class X subobject的1 bytes大小也出现在Class Y和Z身上。某些编译器会对empty virtual base class 提供特殊支持。 3、Alignment的限制:Class Y和 Z的大小截至目前为5 bytes。在大部分机器上,群聚的结构体大小会受到alignment的限制,使它们能够更有效率地在内存中被存取。在32位机上,alignment是4bytes,所以class Y和Z必须填补3 bytes。最终得到的结果就是8 bytes。 现在有些编译器提供“空基类优化”(empty base class optimization),一个empty virtual base class被视为derived class object最开头的一部分,也就是说它并没有花费任何的额外空间。这就节省了上述第2点的1bytes,也就不再需要第三点所说的3bytes的填补。       class Onefunc{ public: void go(void); };   void Onefunc::go() { cout<<"HAHA"<<endl; }     cout<<"Onefunc:"<<sizeof(Onefunc)<<endl; //结果:Onefunc:1 类的大小与(非虚)函数无关,其大小决定于:成员变量,vptr(指向VTable的virtual pointer), Vbptr(virtual base table pointer)。在类Onefunc里什么都没有,故大小与空类大小相同。   【转】 C++类的大小——sizeof()   先看这么个问题——已知: class CBase {     int  a;     char *p; }; 那么运行cout<<"sizeof(CBase)="<<sizeof(CBase)<<endl;之后输出什么? 这个应该很简单,两个成员变量所占的大小有嘛——8。可由时候人就是爱犯这个错误:这么简单的问题人家会问你?再想想……好像C++类里面有个什么函数指针,也应该占字节吧!?什么指针来着?忘了(还是水平低不扎实)!流汗中……算了姑且认为是构造函数和析构函数吧。一人一个加上刚才那8个16个。好笑吗?这是我犯的错误!!!到底C++类的sizeof是多少呢?没有所谓的函数指针问题吗?不甘心,编个例子看看: 第一步:给丫来个空的(不好意思上火粗鲁了) class CBase { }; 运行cout<<"sizeof(CBase)="<<sizeof(CBase)<<endl; sizeof(CBase)=1; 为什么空的什么都没有是1呢?查资料……查啊查……OK这里了:先了解一个概念:类的实例化,所谓类的实例化就是在内存中分配一块地址,每个实例在内存中都有独一无二的地址。同样空类也会被实例化(别拿豆包不当干粮,空类也是类啊),所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有了独一无二的地址了。所以空类的sizeof为1。继续下一步: 第二步: 还是最初的那个类,运行结果:sizeof(CBase)=8 没什么说的,两个内部变量的大小。难道我记错了没有什么指针问题的存在?再试试(早这么有求知欲也不会丢人了,这回来劲了) 第三步:添个虚函数 class CBase { public:     CBase(void);     virtual ~CBase(void); private:     int   a;     char *p; }; 再运行:sizeof(CBase)=12 嗨!问题出来了!!跟虚函数有关。为什么呢?查资料ing…… 有了:“C++ 类中有虚函数的时候有一个指向虚函数的指针(vptr),在32位系统分配指针大小为4字节”噢原来如此害死我了。那么继承类呢? 第四步: 基类就是上面的了不写了 class CChild :     public CBase { public:     CChild(void);     ~CChild(void); private:     int b; }; 运行:cout<<"sizeof(CChild)="<<sizeof(CChild)<<endl; 输出:sizeof(CChild)=16; 可见子类的大小是本身成员变量的大小加上子类的大小。 有空再补一下关于虚函数指针的知识吧。  

上一篇:8个开发必备的PHP功能
下一篇:帧间预测

相关文章

相关评论