求一个类的sizeof应考虑的问题
2012-10-11 06:44
197 查看
昨天面试,面试官让我说一说求一个类的sizeof应该考虑的问题,心想,太好了,之前sizeof可是做了不少功夫,就说了类的非静态、非全局成员,如果有虚函数就要加上一个指向虚表的指针,4字节大小,然后说,大概是这样。面试官就问,虚函数的实现机制是?大概讲了一下虚表之类的东东,然后他问,那如果是虚继承呢,求sizeof还是一样的么?先是一愣,心想,妈呀,什么是虚继承呢,然后还是淡定地回了,应该也是一样的吧,都是用一个指针来指向续表,面试官便没怎么说。
面试完都没怎么再去想sizeof的问题了,一直觉得没什么问题,不过今天一大早,回想一下,觉得不妥,上网搜了一番,发现,原来没有想象的简单,越看也越糊涂,索性自己在VC上写几个类试试,结果,果然是不一样的,昨天的面试果然是悲催了啊T_T
还是先总结一下刚刚领会到的:
一、个空类
class A
{
};
求sizeof的结果是1,因为即使是没有成员之类的,一个类存在,至少都要给他一个空间,不然就没有存在的意义了。
二、简单的类
class A
{
int a;
virtual fun();
}
这个也好求,就是sizeof(A.a)+4(指向虚表的指针)
三、子类普通继承、父类中不含虚函数
class A
{
int a;
}
class B:public A
{
int b;
virtual fun();
}
sizeof(B)=sizeof(A)+sizeof(B.b)+4(指向虚表指针)
四、子类普通继承、父类含虚函数
class A
{
int a;
virtual fun1();
}
class B:public A
{
int b;
virtual fun();
}
sizeof(B)=sizeof(A)-4(sizeof(A)中有一个指向虚表的指针)+sizeof(B.b)+4(指向虚表指针)
因为普通继承,子类和父类的虚函数存放在同一个虚表中,所以,只需要存一个指向续表的指针即可;
五、子类虚继承、父类不含虚函数
class A
{
int a;
}
class B:virtual public A
{
int b;
virtual fun();
}
sizeof(B)=sizeof(A)+4(指示父类存放空间的起始偏移量)+sizeof(B.b)+4(指向B的虚表的指针)
六、子类虚继承、父类含虚函数
class A
{
int a;
virtual fun1();
}
class B:virtual public A
{
int b;
virtual fun();
}
sizeof(B)=sizeof(A)+4(指示父类存放空间的起始偏移量)+sizeof(B.b)+4(指向B的虚表的指针)
虚继承时,父类和子类的虚函数表分开放,所以,分别存储两个指向对应续表的指针,因而不用减去sizeof(A)中续表指针的大小。
之前看的那些sizeof的对齐问题都太基础了,二面果然深入点,准备还是不充分,没办法了,只能祈祷。。。
原文地址:http://blog.sina.com.cn/s/blog_728161840100u2ib.html
面试完都没怎么再去想sizeof的问题了,一直觉得没什么问题,不过今天一大早,回想一下,觉得不妥,上网搜了一番,发现,原来没有想象的简单,越看也越糊涂,索性自己在VC上写几个类试试,结果,果然是不一样的,昨天的面试果然是悲催了啊T_T
还是先总结一下刚刚领会到的:
一、个空类
class A
{
};
求sizeof的结果是1,因为即使是没有成员之类的,一个类存在,至少都要给他一个空间,不然就没有存在的意义了。
二、简单的类
class A
{
int a;
virtual fun();
}
这个也好求,就是sizeof(A.a)+4(指向虚表的指针)
三、子类普通继承、父类中不含虚函数
class A
{
int a;
}
class B:public A
{
int b;
virtual fun();
}
sizeof(B)=sizeof(A)+sizeof(B.b)+4(指向虚表指针)
四、子类普通继承、父类含虚函数
class A
{
int a;
virtual fun1();
}
class B:public A
{
int b;
virtual fun();
}
sizeof(B)=sizeof(A)-4(sizeof(A)中有一个指向虚表的指针)+sizeof(B.b)+4(指向虚表指针)
因为普通继承,子类和父类的虚函数存放在同一个虚表中,所以,只需要存一个指向续表的指针即可;
五、子类虚继承、父类不含虚函数
class A
{
int a;
}
class B:virtual public A
{
int b;
virtual fun();
}
sizeof(B)=sizeof(A)+4(指示父类存放空间的起始偏移量)+sizeof(B.b)+4(指向B的虚表的指针)
六、子类虚继承、父类含虚函数
class A
{
int a;
virtual fun1();
}
class B:virtual public A
{
int b;
virtual fun();
}
sizeof(B)=sizeof(A)+4(指示父类存放空间的起始偏移量)+sizeof(B.b)+4(指向B的虚表的指针)
虚继承时,父类和子类的虚函数表分开放,所以,分别存储两个指向对应续表的指针,因而不用减去sizeof(A)中续表指针的大小。
之前看的那些sizeof的对齐问题都太基础了,二面果然深入点,准备还是不充分,没办法了,只能祈祷。。。
原文地址:http://blog.sina.com.cn/s/blog_728161840100u2ib.html
相关文章推荐
- 求一个类的sizeof应考虑的问题
- 【转】求一个类的sizeof应考虑的问题
- 求一个类的sizeof应考虑的问题
- 求一个类的sizeof应考虑的问题 (
- 求一个类的sizeof应考虑的问题
- 求一个类的sizeof应考虑的问题
- 开放还是封闭?一个值得考虑的问题
- 一个优美的架构需要考虑的几个问题
- 前端学习(2):为document的click事件指定一个事件句柄函数(考虑跨浏览器兼容问题)
- 一个提供数据存储和查询服务的分布式中间件需要考虑的一般问题
- 一个由sizeof引发的问题
- 任意输入一个字符串,输出它的所有子串。Python练习(未考虑去重问题)
- sizeof的一个不曾注意的问题
- 一个有关sizeof()的经典问题
- sizeof()计算一个类的对象大小和sizeof(string)的问题
- 多线程用同一个dao对象就会存在多个线程执行同一方法,为什么不用考虑线程安全问题
- 一个可用的股票回测系统需要考虑的问题(持续更新中…)
- 一个技术人员必须考虑的问题---转型 【转】
- 剑指offer 求一个数的n次方,不考虑大数问题