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一样,可执行文件中没有模板。当模板被实例化时,它会变成一个函数或类,就像任何其他函数或类一样(几乎)。