C++类的大小——sizeof().docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
先看这么个问题——已知: class?CBase { int??a; char?*p; }; 那么运行coutsizeof(CBase)=sizeof(CBase)endl;之后输出什么? 这个应该很简单,两个成员变量所占的大小有嘛——8。可由时候人就是爱犯这个错误:这么简单的问题人家会问你?再想想……好像C++类里面有个什么 函数指针,也应该占字节吧!?什么指针来着?忘了(还是水平低不扎实)!流汗中……算了姑且认为是构造函数和析构函数吧。一人一个加上刚才那8个16个。 好笑吗?这是我犯的错误!!!到底C++类的sizeof是多少呢?没有所谓的函数指针问题吗?不甘心,编个例子看看: 第一步:给丫来个空的(不好意思上火粗鲁了) class?CBase { }; 运行coutsizeof(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; }; 运行:coutsizeof(CChild)=sizeof(CChild)endl; 输出:sizeof(CChild)=16; 可见子类的大小是本身成员变量的大小加上子类的大小。 关于虚拟继承(相当于添加了一个接口): class COneMember { public: ??? COneMember(int iValue = 0){m_iOne = iValue;}; private: ??? int m_iOne; }; class CTwoMember:virtual public COneMember { private: ??? int m_iTwo; }; 长度:12 内存结构: E8 2F 42 00 //指针,指向一个关于偏移量的数组,且称之虚基类偏移量表指针 CC CC CC CC // m_iTwo 00 00 00 00 // m_iOne(虚基类数据成员) 评注:virtual让长度增加了4,其实是多了一个指针,关于这个指针,确实有些复杂,别的文章有具体分析,这里就不岔开具体讲了,可认为它指向一个关于虚基类偏移量的数组,偏移量是关于虚基类数据成员的偏移量。 关于闭合继承: class ClassA { public: ??? ClassA(int iValue=1){m_iA = iValue;}; private: ??? int m_iA; }; ? class ClassB:public ClassA { public: ??? ClassB(int iValue=2){m_iB = iValue;}; private: ??? int m_iB; }; ? class ClassC: public ClassC { public: ??? ClassC(int iValue=3){m_iC = iValue;}; private: ??? int m_iC; }; ? class CComplex :public ClassB, public ClassC { public: ??? CComplex(int iValue=4){m_iComplex = iValue;}; private: ??? int m_iComplex; }; 长度:24 内存结构: 14 30 42 00 //ClassB的虚基类偏移量表指针 02 00 00 00 //m_iB C4 2F 42

文档评论(0)

mhk8089 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档