sizeof 和 类
来源:互联网 发布:组态软件下载 编辑:程序博客网 时间:2024/06/06 16:38
sizeof函数对class类操作,其实与对srtuct结构体是一致的(至少目前我没有发现什么不同之处)
这里补充一点关于父类和派生类中的sizeof用处。
//一个简单的父类class Parent{public: char a; short b;};//一个简单的派生类class Child:public Parent{// 这里其实还加入了父类的一些属性,方法// ......public: int c; char d;};//计算起来跟结构体中包含结构体是一样的。sizeof(Parent)=4 // ( a _ b b )sizeof(Child)=12 // ( a _ b b ( c c c c d _ _ _) )
如果父类中有函数,有虚函数,有纯虚函数的话,情况如下:
//含有普通函数的类class A1{ void fun(){} int a;};sizeof(A1)=4//含有虚函数的类class A2{ virtual void fun(){} int a;};sizeof(A2)=8//含有纯虚函数的类class A3{ virtual void fun() = 0; int a;};sizeof(A3)=8//含有两个虚函数的类class A4{ virtual void fun(){} virtual int fun2(){}};sizeof(A4)=4;
这里我们会发现一个普通函数是不占内存的,而虚函数和纯虚函数因为有虚表的存在而占用一定的内存。这里可以看一篇其他人写的《C++中虚表深入理解》一文,了解下虚表的作用。
http://blog.csdn.net/eagleskys/article/details/6308949
这里我大概理解了一下,带有虚函数的类中,会产生一个指向虚表的指针(占4个字节),而且这个指针一直在对象实例的内存首部位置。如果是单一继承的话,每个对象都只有一个虚表;而多重继承后,会为每个有虚函数的类创建一个虚表,虚表的位置按声明位置排列。如下:
//父类1class Parent1{public: char a; virtual void fun(){} short b;};sizeof(Parent1)=8//这里我们观察下Parent1对象内属性的地址Parent1 p;cout<<(long)&p<<endl; // 2555506 p的首地址 cout<<(long)&(p.b)<<endl; // 2555510 a的首地址cout<<(long)&(p.a)<<endl; // 2555512 b的首地址//父类2class Parent2{public: virtual void fun2(){}};//派生类class Child:public Parent1,public Parent2{};
需要注意的是:在多重继承中,虚表之间不是连在一起的。如果Child中继承自Parent1,而产生的虚表位于0位置的话,那么继承自Parent2而产生的虚表不是在位置4,而是位置8,因为还有一个char和short的位置。虚表相对位于对象实例的首部。
我想差不多就这个意思,如果以后还有什么需要注意再接着记录。
- sizeof 和 类
- sizeof 和 sizeof(string)
- sizeof和sizeof的问题
- sizeof(struct)和sizeof(union)
- sizeof和C++类的问题
- sizeof——类和结构体
- sizeof 类
- sizeof 类
- sizeof 类
- sizeof 类
- sizeof 类
- sizeof()计算一个类的对象大小和sizeof(string)的问题
- sizeof()计算一个类的对象大小和sizeof(string)的问题
- Marshal.SizeOf和sizeof的区别
- Marshal.SizeOf和sizeof的区别
- Marshal.SizeOf和sizeof的区别
- sizeof和sizeof(string)的问题
- sizeof和sizeof(string)的问题
- 美妙的微机原理2013/4/22
- MFC CString和string的互相转换
- TexturePacker Cocos2d 开发的好帮手
- cocos2d-x实例学习(4)之ScaleTo&ScaleBy
- mac下修改mysql的编码格式
- sizeof 和 类
- sso单点登录的三种实现方式
- cocos2d-x实例学习(5)之SkewTo&SkewBy
- [JAVA基础]JDK环境配置
- moc3061控制可控硅bat24-600遇到的问题和解决方法
- Unity3D与Node.js通过TCP通信.
- 反转字符串,优化速度,优化空间。
- paip.软件版本完善计划VC421
- cocos2d-x实例学习(6)之CCRotateTo和CCRotateBy实现变形