static
存储在编译时决定。但是,请考虑我们在函数中进行大量延迟初始化的情况:
void foo ()
{
static int a[1000];
}
我不是在讨论这里的编码实践,而是讨论技术方面。正如执行许多此类其他函数(如 foo()
一样,会在数据段上引入许多static
个变量。
在为数据段分配空间时,编译器是否也会在帐户中进行延迟初始化。如果'否'那么,它会在代码执行时在运行时导致分段错误吗? (当static
方法中的大量template
数据)时,更有可能发生这种情况。
答案 0 :(得分:5)
仅仅因为初始化是懒惰的,分配不是。该标准要求所有静态变量(包括局部变量)在程序启动之前初始化为零。实际上,静态意味着(在这种情况下):变量的空间在程序的整个生命周期中都存在。
答案 1 :(得分:3)
1)对于一件事情,不会有“很多”变量。函数/方法范围中的静态变量非常类似于全局变量。
2)没有懒惰初始化,因为最有可能在应用启动期间初始化,以及所有其他全局变量。
3)我认为没有理由发生错误
编辑:删除了关于归零的声明
答案 2 :(得分:2)
由于执行了许多这样的foo(),因此将在数据段上引入许多静态变量。
没有。你只得到一个foo()::a
。这就是重点。
编译器也会在帐户中进行延迟初始化 为数据段分配空间。如果'否'那么,它会导致 在代码执行时运行时分段错误? (更多 模板方法中很多静态数据可能会发生。)
如果你有太多.data
个对象,你似乎在询问static
部分是否会用完空间(因此进一步写入可能会导致损坏错误)。
好吧,如上所述,它在编译时就知道静态存储需要多少空间(对于功能模板实例化也是如此)。每次调用函数时,不都会获得更多foo()::a
,因此没有运行时元素来确定需要多少空间。
答案 3 :(得分:0)
简短回答:不,你不会发生段错误。
在下面的示例中,abc
位于def
,x
和#include <iostream>
int abc = 123;
int def;
int foo (int i) {
static int x (i);
return x;
}
int main () {
std :: cout << foo (100) << " " << foo (200);
}
位于BSS中。
static
此示例打印出“100 100”:函数范围x
对象的初始化仅在第一次调用期间发生。
def
的存储与foo
之类的全局变量相同。
模板基本相同,除非x
由模板参数化,每个瞬发点都会有一个{{1}}。