gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:32:30 25 4
gpt4 key购买 nike

考虑以下程序:-

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

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

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

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

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

这是 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进入他们自己的部分,但仍然创建一个包含 ubusy 的 bss 部分和ubarra .

链接器因此看到 busy未使用并丢弃它,但是 bss被使用(即使不是全部)并因此被保留。

关于c - 为什么 gcc 垃圾回收对于已初始化全局变量和未初始化全局变量的行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24142151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com