繁体   English   中英

为什么gcc垃圾回收对于已初始化的全局变量和未初始化的全局变量会有不同的行为?

[英]Why gcc garbage collection behave differently for initialized global variables and uninitialized global variables?

考虑以下程序:

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编译了上面的程序,在调试时我发现编译器/链接器没有为繁忙的数组分配任何内存,因为该数组未在任何地方使用。应用程序,如果我在无限while循环中删除该行,GC dint也会为barra数组分配任何内存。

然后,我更改了相同的程序,使busy和barra未初始化的数组如下所示-

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

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

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

相同大小写的初始化数组按预期方式工作,因为它仅为程序中已使用的数组分配内存。

它是bug还是对bss中变量的一些调整?

使用的GCC-4.9.0 20140319

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

所以本质上

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

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

将每个busybarra放在自己的部分,但仍创建一个同时包含ubusyubarra bss部分。

因此,链接器会看到没有使用busy并将其丢弃,但是使用了bss (即使不是全部)也因此将其保留。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM