C++内存占用问题

于学C言中量的内存管理和量所占内存大小的问题到第二段学C++面向象的程序大家肯定会有这样的疑"C++中一个象究竟占用多少内存"


最近于此问题进行了相料整理里解应该很清楚趣的同学网下看

很多C++书籍中都介绍过,一个Class对象需要占用多大的内存空间?

 

最权威的结论是:

*非静态成员变量总合。(静态为0)

*加上编译器为了CPU计算,作出的数据对齐处理。

*加上为了支持虚函数,产生的额外负担。

 

先写一个例子看看(注:以下所有结果都是在 VC6.0 开发环境中得出的结论)

一、空类的Size

classCar

{

};

voidmain()

{

      int size = 0;

      Car objCar;

      size = sizeof(objCar);//  1

      printf("%s %d /r", "Class Car Size:",size);

}

输出结果:ClassCar Size:1

这是为何呢?我想对于这个问题,不仅是刚入行不久的开发新手,就算有过几年以上C++开发经验的开发人员也未必能说清楚这个。

编译器在执行 Car objCar; 这行代码后需要,作出一个Class CarObject。并且这个Object的地址还是独一无二的,于是编译器就会给空类创建一个隐含的一个字节的空间

 

二、只有成员变量的Size

classCar

{

private:

      int nLength;//int类型占4个字节大小

      int nWidth;

};

voidmain()

{

      int size = 0;

      Car objCar;

      size = sizeof(objCar);//  8

      printf("%s %d /r", "Class Car Size:",size);

}

输出结果:ClassCar Size:8


这个结果很多开发人员都清楚。在32位系统中,整型变量占4个字节。这里Class Car中含有两个整型类型的成员变量,所以Class Size8


classCar

{

private:

      int nLength;

      int nWidth;//int类型占4个字节大小

      static int sHigh;//静态变量不占字节为0

};

voidmain()

{

      int size = 0;

      Car objCar;

      size = sizeof(objCar);

      printf("%s %d /r", "Class Car Size:",size);

}

输出结果:ClassCar Size:8

我们这次在Class Car中添加了一个静态成员变量,但是Class Size仍然是8个字节。这正好符合了,结论中的第一条:非静态成员变量总合




classCar

{

private:

      char chLogo//char类型占1个字节大小,但是系统为了CPU计算,做数据对齐,分配了4个字节大小。

      int nLength;

      int nWidth;//int 类型占4个字节大小

      static int sHigh;//静态变量不占字节大小

};

voidmain()

{

      int size = 0;

      Car objCar;

      size = sizeof(objCar);

      printf("%s %d /r", "Class Car Size:",size);

}

输出结果:ClassCar Size:12

在类中又插入了一个字符型变量,结果Class Size变成了12这个就是编译器额外添加3个字符变量,做数据对齐处理,为了是提高CPU的计算速度。编译器额外添加的东西我们是无法看见的。这也符合了结论中的第二条:加上编译器为了CPU计算,作出的数据对齐处理。

既然,我们这样定义类成员数据编译器会额外的增加空。那么,我们何不在定义类的时候就考虑到数据对齐的问题,可以多定义出3个字符类型变量作为预留变量,既能满足数据对齐的要求,也给自己的程序添加了一些可扩展的空间。




三、只有成员函数的Size

classCar

{

public:

      Car(){};

      ~Car(){};

public:

      void Fun(){};

};

voidmain()

{

      int size = 0;

      Car objCar;

      size = sizeof(objCar);

      printf("%s %d /r", "Class Car Size:",size);

}

输出结果:ClassCar Size:1

噢,这是怎么回事儿呢?再做一个实验看看。

classCar

{

public:

      Car(){};

      ~Car(){};

public:

      void Fun(){};

private:

      int nLength;

      int nWidth;

};

voidmain()

{

      int size = 0;

      Car objCar;

      size = sizeof(objCar);

      printf("%s %d /r", "Class Car Size:",size);

}

输出结果:ClassCar Size:8

这次应该很清楚的了。函数是不占用类空间的。第一个例子中的Size1个字节,正是编译器为类创建一个隐含的一个字节的空间。




classCar

{

public:

      Car(){};

      virtual ~Car(){};

public:

      void Fun(){};

};

voidmain()

{

      int size = 0;

      Car objCar;

      size = sizeof(objCar);

      printf("%s %d /r", "Class Car Size:",size);

}

输出结果:ClassCar Size:4

这次,让析构函数为虚函数,看到了Class Size4。这正是指向Virtual Table的指针vptrSize。这正好符合了,结论中的第三条:加上为了支持虚函数,产生的额外负担。

到此为止,一个Class Object究竟占用多少内存空间,已经完全说清楚了。但是,这只是针对单独类,或者说是基类适用。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值