一类中静态成员的内存分配

时间:2011-03-19 03:52:17

标签: c++ visual-c++ c++11

我最近发布了一个问题: Initialization of Static Class members.

现在请检查此代码:

#include<iostream>
class A
{
    static int obj_s;
public: 
    A()
    {
        obj_s++;
        std::cout << A::obj_s << "\nObject(s) Created\n";
    }
};

int A::obj_s = 0;

int main()
{
}

即使一个人没有创建任何A类对象,让成员obj_s持有一个值0 - 自定义之后是不是需要内存?

3 个答案:

答案 0 :(得分:7)

显然,这需要记忆。 int A::obj_s=0正是它所做的:它定义变量及其内存。事实上,当我们说我们定义了变量X时,这意味着我们定义了sizeof(X)的内存,以及我们标记为X的内存区域。


有关静态成员的更多信息:

A::obj_s是班级A的静态成员。并且静态成员不存在任何实例。它们不属于A的实例。

§9.4.2/ 3和7,标准,

  静态数据成员一旦

  定义,即使没有对象也存在   已经创建了它的类。

     

初始化静态数据成员   并且销毁完全像非本地   对象(3.6.2,3.6.3)。

在这里阅读我的完整答案:

Do static members of a class occupy memory if no object of that class is created?

答案 1 :(得分:0)

成员obj_s是静态的,这意味着它是独立于类定义的。

该行:

int A::obj_s=0;

不仅定义了它的值,还定义了它使用的内存 这就是为什么在上一个问题中你得到一个链接器错误(没有为'obj_s`分配空间。现在你已经添加了一行,编译器定义了对象使用的内存位置,程序现在链接

答案 2 :(得分:0)

由于该类从未实例化,因此构造函数将在链接阶段被省略,因此静态成员可能也是如此,因为它只是由构造函数引用。

我不能100%肯定上述声明。我最大的不确定性是零初始化是否构成参考。

编辑:抓一点。我刚刚测试过,发现gcc会将静态对象发送到最终的可执行文件中,即使它根本没用完。

编辑2 :我刚想到,如果类的方法和静态成员都是在一个单独的编译单元中定义的,那么它们实际上将从最终的可执行文件中删除。它们仅在测试用例中弹出,因为链接器仅在编译单元级别进行修剪,而不是单个符号。

编辑3 :不,即便如此。似乎gcc想要链接每个.o,甚至是main()未直接或间接引用的那些.o。你每天都学到新东西。