【问题标题】:Memory Allocation of Static Members in a Class类中静态成员的内存分配
【发布时间】:2011-07-18 14:40:51
【问题描述】:

我最近发布了一个问题: 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 - 自从它被定义后它不需要内存吗?

【问题讨论】:

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


    【解决方案1】:

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

    行:

    int A::obj_s=0;
    

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

    【讨论】:

    • 如果我不初始化静态变量并且不创建类的任何对象,那么内存会分配给静态变量。
    • @Krishna_Oza:如果您不声明它,则不会分配内存。但这会导致链接器错误(因为构造函数中使用了 obj_s)。如果你不初始化它,那么编译器会将对象初始化为零(就像它对所有静态存储持续时间对象所做的那样)。
    【解决方案2】:

    显然,它需要内存。而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?

    【讨论】:

    • @Downvoters:请说明原因。只是不要在没有告诉我问题的情况下像这样投反对票!
    • @Downvoter:再次投反对票,没有说明原因?你怎么了?
    【解决方案3】:

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

    我不能 100% 确定上述说法。我最大的不确定是零初始化是否构成参考。

    编辑:从头开始。我刚刚测试并发现 gcc 将静态对象发送到最终的可执行文件中,即使它根本没有使用。

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

    编辑 3:不,即使这样也不要。似乎 gcc 想要链接到每个 .o,即使是那些没有被main() 直接或间接引用的。你每天都会学到新东西。

    【讨论】:

      猜你喜欢
      • 2017-03-22
      • 2015-07-23
      • 2011-03-23
      • 1970-01-01
      • 1970-01-01
      • 2016-02-07
      • 2016-01-26
      • 1970-01-01
      • 2020-07-04
      相关资源
      最近更新 更多