求一个类的sizeof应考虑的问题

  昨天面试,面试官让我说一说求一个类的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的对齐问题都太基础了,二面果然深入点,准备还是不充分,没办法了,只能祈祷。。。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值