基础练习三(类的大小)

类所占内存大小,这里做一下实验:

1.只有成员函数

class A
{
 A()
 {

  ;
 }
 ~A()
 {
  ;
 }
void atest()
 {
  ;
 }
};

 printf("%d\n",sizeof(A));值为1,

当类中没有定义数据成员时,也就是没有占据存储空间,但是由于当创建一个对象时,要标识一个对象,必须通过给它分配存储空间来引用对象,所以系统会给它分配一个字节。里面的成员函数的增减并不会影响分配内存的大小。

2.有虚函数的情况

class A
{
 A()
 {
  ;
 }
 ~A()
 {
  ;
 }
    virtual void atest()
 {
  ;
 }
};

printf("%d\n",sizeof(A));输出的值为4

由于有一个虚函数,此时需要引入了一个隐含的虚表指针成员,所以为4。

3.有成员变量的情况

class A
{
 A()
 {
  ;
 }
 ~A()
 {
  ;
 }
 int a;
 double b;
};

printf("%d\n",sizeof(A)); //输出为16

此时的成员变量需要占内存空间,考虑到字节对齐的情况,所以输出的结果为16

 

4.静态成员变量的影响

class A
{
public:
 A()
 {
  ;
 }
    ~A()
 {
  ;
 }

 double a;
 static int b;
 
};
int A::b=5;

 printf("%d\n",sizeof(A));///输出的值为8

因为变量b为静态成员变量,编译时放在了全局的编译区,它是类的一个数据成员.但是它不影响类的大小,不管这个类实际产生了多少实例,还是派生了多少新的类,静态成员数据在类中永远只有一个实体存在,而类的非静态数据成员只有被实例化的时候,他们才存在.但是类的静态数据成员一旦被声明,无论类是否被实例化,它都已存在。

类的静态数据成员必须在类外初始化。只有静态常量才能在类中初始化

所以在计算类的大小时(sizeof计算时)静态成员变量的内存大小没有包括在内。

 

综上所述,在计算类所占的内存空间时,主要包括一下几部分内容:

非静态数据成员的大小

隐含的虚表指针成员

性能优化采用的地址对齐

类继承时,和成员函数所占内存空间方法一样。相加,但要考虑地址对齐。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值