有人可以告诉我static
变量/函数分配内存和内存段吗?即static global variable, static member variable, static local variable
等所有都在程序开始之前初始化一次并且都保留其值?
此外,如果Class MyClass
具有静态变量count
,当我在main中声明MyClass obj
时,会创建MyClass
对象并为count赋予内存,如果我声明了{ {1}},记忆方面会发生什么? MyClass obj2
中是否有count
引用了obj2
的{{1}}?或者只有单独的内存分配。希望这样我能够清楚地提出这个问题。
提前致谢。
答案 0 :(得分:4)
当我们将类的成员声明为static
时,这意味着无论创建了多少个类的对象,都只有static
成员的一个副本。 即使没有静态数据成员类的对象存在也存在。
static
成员由该类的所有对象共享。
如果我宣布
MyClass obj2
,内存方面会发生什么?count
中是否有obj2
引用了count
的{{1}}?
是。所有对象只有一个obj1
。这个测试程序会解释清楚这一点;
count
输出:
class Something
{
public:
static int s_nValue;
};
int Something::s_nValue = 1;
int main()
{
Something cFirst;
cFirst.s_nValue = 2;
Something cSecond;
std::cout << cSecond.s_nValue;
return 0;
}
由于2
是s_nValue
成员变量,因此static
在类的所有对象之间共享。 因此,s_nValue
与cFirst.s_nValue
相同。
此外,如果类
cSecond.s_nValue
具有MyClass
变量计数,当我在main中声明tatic
时,则会创建MyClass obj
对象并为MyClass
提供内存
没有。实际上,即使没有实例化类的对象,count
也存在!
答案 1 :(得分:0)
关键字static
可能会被视为有些过度&#34;重载&#34;。
以下用法选项都是可行的:
就运行时而言,所有类型的静态变量基本相同。它们都位于程序的数据部分中,并且它们的地址在程序执行期间保持不变。因此,它们之间的唯一区别是在编译期间,在声明范围内:
就运行时而言,所有类型的函数(静态和非静态)基本相同。它们都驻留在程序的代码段中,并且它们的地址在程序执行期间保持不变。因此,它们之间的唯一区别是在编译期间,在声明范围内:
答案 2 :(得分:0)
关键字static
具有不同的含义,具体取决于它所使用的上下文。static
变量在堆上分配,它们的生命周期在整个程序运行中延伸。
静态全局变量与全局变量相同,只是static
关键字将变量的范围限制为仅包含它的文件。这称为文件链接或内部链接。
定义包含它的类时,会创建静态成员变量。这意味着可以使用类的名称访问它。该变量在类的所有实例中共享。
静态局部变量与静态全局变量具有相同的生命周期,但其范围是包含它的直接块。
当使用static
关键字限定函数时,这意味着函数的范围是仅包含它的文件。该函数不能被另一个文件中的函数调用。这又称为文件范围或内部链接。