对c++类型做sizeof操作结果及分析

关于C++对象的内存布局,网上有很多的文章可以参考,写的比较好的是陈浩的两篇:

C++ 对象的内存布局(上)点击打开链接

C++ 对象的内存布局(下)点击打开链接

这里只讨论c++里面类用sizeof取值的输出问题。

有这么一个面试题:下面这段代码的输出是什么?

#include<stdio.h>
class A
{
  int a;
  char b;
  virtual void doing()=0;
};

int main()
{
    printf("%d\n",sizeof(A));
    return 0;
}

32位机器上,linux+gcc编译执行的结果是12。因为char要与int保持地址对齐,需要4字节,而虚函数表指针为4字节,

所以输出结果是4+4+4=12;

如果doing()函数有自身的实现,不是纯虚函数呢,输出也是12,只不过这时候虚函数表指针指向的虚函数表已经有了具体的函数入口地址,而不是NULL;

如果A的定义是这样的:

class A
{
  int a;
  char b;
  void doing()=0;
};
这时候输出结果就是8了,我的理解是sizeof(A)相当于sizeof(a),而a是A类的一个对象,sizeof()操作只会计算成员变量和虚函数表指针所占用的内存空间。

普通方法(无论是否是static的),都不会计算在sizeof的结果内,类的static变量也不会计算在sizeof结果内。他们在内存里面都只有一份,存储在静态存储区。

读者可以试试下面的A类定义,运行下看看输出结果是什么。

#include<stdio.h>
class A
{
  int a;
  char b;
  void doing(){
   int a;
   }
  static double f;
  static void func()
  {
  float fl;
  }
};

int main()
{
    printf("%d\n",sizeof(A));
    return 0;
}
欢迎留言与讨论,有什么不对的地方请尽管指出。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值