C++类的内存分配

今天面试被问到一个类的内存问题,有些记不清楚了。用了 C++这么年,实在是不应该。

于是上网查了一些资料,并做了实验,整理如下:

所用测试环境为64位mac air,编译器为XCode

1.最简单

class Test
{
public:
    int  a ;
};
printf("size=%d\n",sizeof(Test));

这个相信大家都能猜得到。答案是4.这个不解释。

值得一提的是,

    Test t;
    printf("%d,%d",&t,&(t.a));

t,和t.a的地址是一样的

 

 

2.加上成员函数 

class Test
{
public:
    int a ;
    int tt(){return 0;}
};

这个可能有些难度 。有人猜是4,有人猜是8,或者其它。

这个仍然是4,原因是成员函数并不属于类(或者说对象),所有的成员函数和全局函数等,都在代码段。所以在调用成员函数时,会隐式的传个this过去,这个this作用其实就是将对象内所有成员变量传递进去。

关于这一点,读过《Lua程序设计》的“面向对象”一章的同学,可能会有更深刻的体会。

 

3.static  

class Test
{
public:
    int a ;
    static int b ;

    int tt(){return 0;}
};

结果仍然是4,static 变量不占用内存??

不是的,static 变量存放在静态区,并不和普通成员变量在一个区域,所以仍然是4.

 

4.增加virtual 

 

class Test
{
public:
    int a ;
    virtual int tt(){return 0;}
};

增加一个virtual ,会增加一个虚函数表指针(即使有多个虚函数,也仅有一个虚函数表)

一个有趣的问题是,一个指针占用多少个字节,是4 个字节 吗?

不是的,其实和机器字长有关,在32位机器上是4字节,如果在64位机器上,则是8个字节 。

所以在我的编译环境下,这个的答案应该是12

 

5.继承的情况

继承的情况下,子类的字节数就是父类加子类.

但需要注意的一点是,子类只有一份虚函数表指针,指向的表中是父类虚函数加子类虚函数

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值