X86 静态存储(主要是数据段)是否会导致分段错误?

X86 静态存储(主要是数据段)是否会导致分段错误?,x86,segmentation-fault,lazy-initialization,data-segment,X86,Segmentation Fault,Lazy Initialization,Data Segment,静态存储在编译时决定。但是,考虑在函数中有很多惰性初始化的情况: void foo () { static int a[1000]; } 这里我不是在讨论编码实践,而是技术方面。当执行许多类似于foo()的其他函数时,将在数据段上引入许多static变量 在为数据段分配空间时,编译器也会在帐户中进行延迟初始化。如果“否”,那么在代码执行时,它是否会在运行时导致分段错误?(当模板方法中有大量静态数据时,更可能发生这种情况) 当许多这样的foo()被执行时,这些静态变量将被引入到数据段中 不可

静态
存储在编译时决定。但是,考虑在函数中有很多惰性初始化的情况:

void foo ()
{
  static int a[1000];
}
这里我不是在讨论编码实践,而是技术方面。当执行许多类似于
foo()
的其他函数时,将在数据段上引入许多
static
变量

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

当许多这样的foo()被执行时,这些静态变量将被引入到数据段中

不可以。您只获得一个
foo()::a
。这就是重点

编译器是否也会在帐户中进行延迟初始化 为数据段分配空间。如果‘否’,会不会导致 代码执行时运行时的分段错误?(更多 当模板方法中包含大量静态数据时,可能会发生这种情况)

如果有太多的
静态
对象,您可能会询问
.data
部分是否会耗尽空间(从而进一步写入它可能会导致损坏错误)


正如上面提到的,在编译时,静态存储(对于函数模板实例化)需要多少空间是已知的。每次调用函数时,您不会得到更多的
foo():a
,因此没有运行时元素来确定需要多少空间。

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

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

2) 不存在最有可能在应用程序启动期间初始化的惰性初始化,以及所有其他全局变量

3) 我看不出有什么理由犯错


编辑:删除了关于归零的语句

简短回答:不,你不会出错

在下面的示例中,
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);
}
#包括
int abc=123;
int-def;
int foo(int i){
静态int x(i);
返回x;
}
int main(){

Std::Couth:一种语言。C和C++是不同的。@ Tomalak,这两种语言都适用。@他的例子显然在C和C++的公共子集中很好。作为共同子集的一部分,人们希望在两种情况下答案都是相同的。@ IAMMLNIN:大的听众是不相干的。重要的是它被标记为CORE。C,C++没有任何数据段的概念,如果这种东西甚至存在,它是一个平台特定的东西,所有语言的编译器都需要它。@ DealMG:但是它们确实定义了静态持续时间对象的语义。如果我正确地理解了这个问题,他会问分配,而不是初始化。(当然,他的例子没有任何初始化,除了静态变量中始终存在的零初始化。)@James:Aha,我想我现在明白了。
执行的
foo()等
,我指的是其他类似
foo()
;而不是
foo()的函数
单独使用。@iammilind:你是说有尽可能多的包含静态持续时间对象的函数吗?好吧,编译器/链接器也可以在构建时看到所有函数……它将“清空缓冲区”HEHE是的,我在VS2010中检查的时候是正确的。旧版本的VSIT应该不是这样的。如果不是,那么这是对语言的一种公然违反。而不是我太惊讶了。+ 1,但是如果空间被分配给所有的<代码>静态< /C。ode>变量,那么
template
s如何分配空间。@iammilind-没有区别。编译器知道实例化了多少模板,并且可以添加所需的空间。所有这些都是在编译时确定的。@iammilind:模板不会更改任何内容。模板在生成时实例化,每次都会更改p你可以从中得到一个函数。就像你的
foo()
@iammilind一样,可执行文件中没有模板。当模板被实例化时,它会变成一个函数或类,就像任何其他函数或类一样(几乎)。