[英]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];
将每个busy
和barra
放在自己的部分,但仍创建一个同时包含ubusy
和ubarra
bss部分。
因此,链接器会看到没有使用busy
并将其丢弃,但是使用了bss
(即使不是全部)也因此将其保留。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.