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