为什么gcc垃圾收集对初始化的全局变量和未初始化的全局变量的行为有所不同?

时间:2014-06-10 13:21:02

标签: c arrays gcc garbage-collection

考虑以下程序: -

int busy[53] = { 1,2} ;
int barra[50]  = {4,5};

int main(void)
{
    int bb;
    while (1)
    {
        bb = barra[3];
    }
}

我使用带有参数“-Wl, - gc-sections -fdata-sections”的gcc编译上面的程序,并且在调试时我发现编译器/链接器没有为数组繁忙分配任何内存,因为这个数组不是在应用程序中的任何地方使用,如果我在无限循环中删除行,GC dint也为barra数组分配任何内存。

然后我改变了相同的程序,使忙碌和barra未初始化的数组如下 -

int busy[53];
int barra[50];

现在我使用相同的命令行参数编译新程序(在循环中使用行),当我调试时,发现编译器/链接器为busy和barra数组分配了内存,而不仅仅是barra。如果我在无限循环中删除行并重新编译,GC dint会为两个数组分配任何内存,与初始化数组相同。

所以我很好奇为什么编译器/链接器/ GC(不确定是哪一个)在程序中只使用一个数组时为两个未初始化的数组分配内存?

相同的情况init数组按预期工作,因为它只为程序中使用的数组分配内存。

对于bss中的变量,这是一个错误还是一些调整?

使用GCC - 4.9.0 20140319

1 个答案:

答案 0 :(得分:0)

我只能猜测,但可能-fdata-sections仅适用于“真实”数据部分,而不适用于bss部分。

基本上,

int busy[53] = { 1,2} ;
int barra[50]  = {4,5};

int ubusy[53];
int ubarra[50];

将每个busybarra放入他们自己的部分,但仍会创建一个包含ubusyubarra的bss部分。

链接器因此看到busy未被使用并丢弃它,但使用了bss(即使不是完整的)并且因此被保留。