sizeof的学习笔记

最近和同事偶尔间讨论sizeof的使用,之前还觉得自己学得挺不错呢。用程序一检验才发现,好多都想错了呢。
把我总结的发出来,供大家参考。希望对大家的学习有所帮助。
测试环境为32位机的VC6编译器下。
首先来看一下比较基本的一些类型,这些大家基本也都已经掌握了,再来巩固一下吧。
int main()
{
  cout<<"int:"<<sizeof(int)<<endl;//4Byte
  cout<<"char:"<<sizeof(char)<<endl;//1Byte
  cout<<"float:"<<sizeof(float)<<endl;//4Byte
  cout<<"double:"<<sizeof(double)<<endl;//8Byte
  cout<<"long:"<<sizeof(long)<<endl;//4Byte
}
上面的实例是不是跟你想的一样呢。呵呵~是不是觉得很简单。那下面再来看几个实例吧。
首先来看一下关于结构体的计算吧。
struct str1
{
   int a;
   char b;
   float c;
}
sizeof(str1)=?
你觉得会是几呢?大家都知道,结构体求sizeof是所有项之和对吧。
4+1+4=9?
错罗!正确答案是4+4+4= 12;
原因很简单,char类型在确实是占用1Byte,但是分配给它的空间却是4。
大家可以试一下,做如下更改:
struct str1
{
   int a;
   char b1;
   char b2;
   char b3;
   char b4;
   float c;
}
此时sizeof(str1)依旧是12,但是当再加入一个char类型时,它的大小就变为16了。原因如上所述。
那如果struct中仅有一个char类型呢?大家觉得会是多少?
答案是1,具体原因是为什么呢?这我还真不知道。了解的同学告诉我吧。呵呵~

下面再来看一下联合体union的sizeof如何计算。实例如下:
union un1
{
  int a;
  char b;
  long c;
}
sizeof(un1)=?
我们知道,联合体的sizeof的计算方式,是选取其中占用空间最大的项。
由此可见,答案为4
那如果联合体中也仅有一个char类型呢。答案仍旧为1。
二、下面我们再来看一个针对类,它的sizeof如何计算?
因为针对内存的占用方面的知识我了解的不多,只是靠找技巧记住了一些情况。会进行各种计算。
有些真的说不清楚原因。只能把结果和计算方式告诉大家,具体原因大家可以去分析体会一下。
如一个最简单的一个类
class CTestA
{

}
类中没有任何具体的实现操作,sizeof(CTestA)=?答案是1。
那如果让CTestB来继承CTestA呢。
class CTestB:public CTestA
{
}
sizeof(CTestB)=1.
如果CTestA实现如下呢?
class CTestA
{
public:
CTestA();
virtual CTestA();
}
则sizeof(CTestA)=4;

同样,若CTestB实现CTestA,则sizeof(CTestB)=4;
而无论CTestB是否有构造函数和析构函数。
但是若CTestB用虚基类的方式来继承CTestA的话,即
class CTestB:virtual public CTestA
{
 public:
   CTestB();
   virtual ~CTestB();
}
则sizeof(CTestB)=8;
类似的还可以有很深的扩展,如


这里面的变换很复杂,具体的大家可以自己去体会、测试,其实蛮有意思的。
就写到这儿吧。好多具体的原因道理我也没有弄清楚,所以也没法写出来跟大家共享了。
再学习一段时间,等我真正明白了,再回来补充吧。

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值