gpt4 book ai didi

c - 为什么 .bss 显式地将全局变量初始化为零?

转载 作者:太空宇宙 更新时间:2023-11-04 05:20:37 28 4
gpt4 key购买 nike

我正在生成 mips 反汇编以对其进行模拟。我需要大数据来处理它,但我不想有大的程序集文件,所以我想处理一个大的未初始化数组(然后可能在我的模拟器中初始化它......)。所以我需要这个数组是全局的。而全局变量好像是放在.bss段,实际访问页面时才初始化。问题出在我的二进制文件中,数组位于 .bss 部分,但明确填充为零...如果我正确理解我在互联网上找到的内容,这不是预期的行为...有没有办法说编译器(或链接器,或加载器......我不太明白哪个是做什么的)没有真正把零放在这个数组中?或者,我们可以在编译时有一个选项,或者一个 C 指令来说明我们不希望这个数组用 0 初始化吗? (我尝试用 attribute 更改数组部分,但它仍然初始化为 0)。

顺便说一句,我正在用 objdump 生成反汇编文件,它通常会跳过零 block ,但我确实需要反汇编其他零 block ,所以我使用了“-z”选项。

我真的不明白的是,我到处看,都说.bss部分并没有真正在二进制文件中放零......

最佳答案

.bss 部分的数据没有存储在编译后的目标文件中,因为没有数据——编译器恰好将变量放在该段中因为它们应该被零初始化.

当操作系统加载可执行文件时,它只查看 .bss 段的大小,分配那么多内存,并为您对其进行零初始化。通过不将该数据存储在可执行文件中,它减少了加载时间。

如果你想用某些数据初始化数据,那么在你的代码中给它一个初始化器。然后编译器会将其放入 .data 段(初始化数据)而不是 .bss(未初始化数据)。当操作系统随后加载可执行文件时,它将为数据分配内存,然后将其从可执行文件中复制进来。这需要额外的 I/O,但您的数据已按照您的需要进行了显式初始化。

或者,您可以将数据保留在 .bss 段中,然后在运行时自行初始化它。如果数据在运行时快速且容易生成,那么在启动时重新计算它可能比从磁盘读取它更快。但这些情况可能很少见。

关于c - 为什么 .bss 显式地将全局变量初始化为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11424980/

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