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

时间:2011-07-12 09:34:53

标签: x86 segmentation-fault lazy-initialization data-segment

static存储在编译时决定。但是,请考虑我们在函数中进行大量延迟初始化的情况:

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

我不是在讨论这里的编码实践,而是讨论技术方面。正如执行许多此类其他函数(如 foo()一样,会在数据段上引入许多static个变量。

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

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

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

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

3)我认为没有理由发生错误

Read more about Static(C++)

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

答案 2 :(得分:2)

  

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

没有。你只得到一个foo()::a。这就是重点。

  

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

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

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

答案 3 :(得分:0)

简短回答:不,你不会发生段错误。

在下面的示例中,abc位于defx#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}}。