2

static存储在编译时决定。但是,考虑一下我们在函数中有很多延迟初始化的场景:

void foo ()
{
  static int a[1000];
}

我在这里讨论的不是编码实践,而是技术方面。由于执行了许多其他功能 ,因此将在数据段中引入这些变量foo()static

编译器在为数据段分配空间时也会考虑到延迟初始化。如果“否”,那么它会在代码执行时在运行时导致分段错误吗?static(当方法中有大量数据时更可能发生template)。

4

4 回答 4

5

仅仅因为初始化是惰性的,分配不是。该标准要求所有静态变量(包括局部变量)在程序启动前初始化为零。事实上,静态意味着(在这种情况下):变量的空间在程序的整个生命周期中都存在。

于 2011-07-12T09:40:20.233 回答
3

1)一件事不会有“很多”变量。函数/方法范围内的静态变量非常类似于全局变量。

2)没有惰性初始化,因为很可能在应用程序启动期间初始化,以及所有其他全局变量。

3) 我看不出有任何故障的原因

阅读更多关于静态(C++)

编辑:删除关于归零的声明

于 2011-07-12T09:42:26.660 回答
2

由于执行了许多这样的 foo(),因此将在数据段中引入这些静态变量。

不,你只会得到一个foo()::a。这就是重点。

编译器在为数据段分配空间时也会在帐户中进行延迟初始化。如果“否”,那么它会在代码执行时在运行时导致分段错误吗?(当模板方法中有大量静态数据时更可能发生)。

.data如果您有太多static对象,您似乎在询问该部分是否会用完空间(因此进一步写入它可能会导致损坏错误)。

好吧,如上所述,在编译时就知道静态存储需要多少空间(也用于函数模板实例化)。每次调用函数时都不会得到更多,因此没有运行时元素来确定需要多少空间。foo()::a

于 2011-07-12T09:39:28.027 回答
0

简短的回答:不,你不会出现段错误。

在下面的示例中,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化,每个实例化都会有一个。

于 2011-07-12T09:52:44.970 回答