sizeof的作用——解释类中与类之外static变量的情况

  今天看程序员面试宝典的时候遇到一个问题,书上有这么一句话:sizeof计算栈中分配的大小。咋一看这句话的时候,很不理解,难道像函数中类似于static、extern const类型的变量的sizeof都是0?

  本着实践出真知的原则,我测试了一下:

static int s = 10;

extern const int h = 10;

void main()

{

    cout << sizeof(s) <<endl<<sizeof(h)<< endl;

    getchar();

}

输出结果:

4

4

  结果和书上所说明显不符,再仔细看书,发现这句话的上下文是类中,确实,当sizeof计算类的大小的时候,是不考虑static这种共享成员的。

class A1

{

public:

    A1():d(10){};

    int a;

    char c;

    const int d;

    static int b;

};

void main()

{

    A1 x;

    int *p = (int *)&(x.d);

    *p = 20;

    cout << sizeof(A1)<<endl;

    getchar();

}

输出结果:

12

  虽然书上说的是有上下文情境的,但我觉得很容易误导读者,所以,在此,我就根据资料和我自己的理解来对sizeof做个说明:

  sizeof的本质是得到某个类型的大小,确切的来说就是当创建这个类型的一个对象(或变量)的时候,需要为它分配的空间的大小。而类也可以理解为类似于int、float这样的一种类型,当类中出现static成员变量的时候,static成员变量是存储在静态区当中的,它是一个共享的量,因此,在为这个类创建一个实例对象的时候,是无需再为static成员变量分配空间的,所以,这个类的实例对象所需要分配的空间是要排除static成员变量的,于是,当sizeof计算类的大小的时候会忽略static成员变量的大小。

  根据上述我所提出的解释,就能说明static变量不在类中的时候,用sizeof得到的大小为什么不是0了,因为static不在类中的时候,为static类型(static int等等)定义一个变量的时候,是必须要分配空间的,所以sizeof计算得到的就是为这个类型的 变量分配的空间的大小。

  如有不足,还请各位指正!

posted @ 2014-06-19 15:34  不专业的程序猴子  阅读(1751)  评论(0编辑  收藏  举报