一直都sizeof有点恐惧,老是被折磨的七荤八素的,感觉最近脑袋有点浆糊了。再次狠下心来,花了一个下午研究了一下sizeof的用法。sizeof那些基本用法就不啰唆了,网上一搜一大把,单纯讲讲自己的学习心得。

     首先讲一下sizeof(对象)吧,大家都知道sizeof一个空对象(没有任何成员)结果是1,但有没有想过假如这个对象没有成员变量,但有成员函数呢?这样的对象sizeof出来结果又是什么呢?假如你不知道或者不肯定就赶快弄个例子测试一下吧。下面我定义一个例子:

 class test

{

    void output()

    {}

};

上面这个类sizeof出来是多少呢?结果仍是1。先别骂我,还有下文。我再定义一个例子:

class test

{

     virtual void output()

    {}

};

这个类sizeof出来的结果是多少呢?答案是4.为什么呢?因为这个类多了一个指向虚函数表的指针,也就是说它多了一个指针,但因为不能明眼看到。这个也是sizeof的一个陷阱,也说明学习要注意细节。

      接下来说说sizeof的对齐问题吧,这也是sizeof的一个难点,再来这里我栽了几次跟头。先看看下面这个结构体吧:

struct s1

{

    int  i;

    double j;

    char c;

    int k;

};//sizeof(s1)=?

答案是24,这个结果相信不用细说,大家都算出来了。那么接下来这个这个结构体呢:

struct s2

{

  int i;

  char c;

  double j;

  int k;

};//sizeof(s2) = ?

答案依然是24。有点疑问吧?其实也没什么,因为人家要跟最大变量对齐,仅此而已,所以就算后面四个用不上,人家也要占个位。接下来这个这个结构体:

struct s3

{

  char c1;

  char c2;

  double j;

  int n;

};//sizeof(s3) =?

答案还是24,也是上面那个原因。再来看看这个下面这个结构体:

struct s4

{

   double j;

   char c1;

   char c2;

   int n;

};//sizeof(s4) = ?

这个答案不再是24了,而是16,为什么呢?因为double的对齐方式8,char的对齐方式是1,int的对齐方式是4,现在明白了吗?

  以上是今天下午研究sizeof所得体会。如若不足或者不对的地方,还望各位拍拍砖。

posted on 2010-10-31 17:12  jack_zjz  阅读(285)  评论(0编辑  收藏  举报