我最近发布了一个问题: 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
- 自定义之后是不是需要内存?
答案 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。你每天都学到新东西。