• 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计算得到的就是为这个类型的 变量分配的空间的大小。

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

  • 相关阅读:
    集群资源队列监控:Grafana
    1
    3月9号
    jmx
    日常笔记
    nsenter命令简介
    一天2小时
    postgresql Centos7部署
    笔记5
    1
  • 原文地址:https://www.cnblogs.com/yanqi0124/p/3796736.html
Copyright © 2020-2023  润新知