【问题标题】:Do static members of a class occupy memory if no object of that class is created?如果没有创建该类的对象,该类的静态成员是否会占用内存?
【发布时间】:2011-06-18 01:01:33
【问题描述】:

假设我有一个类,其中有一个静态成员,但我没有创建该类型的任何对象。静态变量会占用内存吗?如果它被占用了,把它放在一个班级里有什么意义?

【问题讨论】:

    标签: c++ class static


    【解决方案1】:

    没有。

    静态成员不属于类的实例。它们甚至不会增加 1 位的实例和类大小!

    struct A
    {
        int i;
        static int j;
    };
    struct B
    {
        int i;
    };
    std::cout << (sizeof(A) == sizeof(B)) << std::endl;
    

    输出:

    1
    

    AB 的大小完全相同。静态成员更像是通过A::j 访问的全局对象。

    在 ideone 上查看演示:http://www.ideone.com/YeYxe


    $9.4.2/1 来自 C++ 标准 (2003),

    静态数据成员不是 一个类的子对象。有 只有一个静态数据成员的副本 由所有对象共享 类。

    标准版 9.4.2/3 美元和 7 美元,

    一旦静态数据成员被 已定义,即使没有对象也存在 已经创建了它的类。

    静态数据成员被初始化 并像非本地一样被销毁 对象(3.6.2、3.6.3).

    正如我所说,静态成员更像是全局对象!

    【讨论】:

    • +1 用于链接到标准中的定义,基本上概括了具体的答案。
    • YeYxe 链接已损坏
    • 我认为 "No." 是当前出现的标题问题的错误答案。根据您自己对标准的引用,无论该类型对象的实例化或缺少,都会为静态成员留出内存;它只是存储在“单个”对象中。
    【解决方案2】:

    C++ 标准没有明确说明何时分配静态内存,只要它在首次使用时可用。也就是说,它很可能是在程序初始化期间分配的,从而保证它在需要时立即存在,而不需要特殊情况代码来检测和执行访问分配。

    将静态数据放入类中的目的与将任何其他数据放入类中的目的相同。通过将数据放入类结构中,您定义了一个封装命名空间,并且能够使用访问器和修改器方法控制访问;反过来,这将允许您验证进入静态内存存储的数据,并确保在使用此数据的整个过程中保持一致性。

    【讨论】:

    • 实际上,我认为该标准将静态成员视为所有全局变量,据我所知,它们的实例化与其他全局变量的实例化相同。也就是说,一个翻译单元内的初始化顺序必须是一致的,并且没有说与其他翻译单元的多路复用。
    【解决方案3】:

    静态变量存储在称为 BSS 的特殊内存区域中,而类的实例存储在堆或堆栈中。所以,静态成员是分开存储的。

    【讨论】:

    • 其实BSS的存在是系统依赖的。 C++ 标准没有定义任何此类野兽,也没有定义数据分配实现的任何细节。
    猜你喜欢
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多