Loader BSS段存储什么?

Loader BSS段存储什么?,loader,Loader,我知道BSS段存储未初始化的全局变量和静态变量,并将它们初始化为零。但是如果全局/静态变量被初始化,我的第二个问题是我读到BSS段不消耗内存,那么它将这些变量存储在哪里呢?谢谢您可能读到BSS段不会占用磁盘上可执行文件的空间。加载可执行文件时,BSS段肯定会占用内存空间。操作系统加载器分配空间并将其初始化为零。如果已初始化,全局/静态变量将存储在.DATA段中。当您在.data段中声明数据时,您为该数据提供了值,因此它必须作为可执行文件的一部分存储 另一方面,您只需要声明.BSS需要多少数据,因

我知道BSS段存储未初始化的全局变量和静态变量,并将它们初始化为零。但是如果全局/静态变量被初始化,我的第二个问题是我读到BSS段不消耗内存,那么它将这些变量存储在哪里呢?谢谢

您可能读到BSS段不会占用磁盘上可执行文件的空间。加载可执行文件时,BSS段肯定会占用内存空间。操作系统加载器分配空间并将其初始化为零。

如果已初始化,全局/静态变量将存储在.DATA段中。当您在.data段中声明数据时,您为该数据提供了值,因此它必须作为可执行文件的一部分存储


另一方面,您只需要声明.BSS需要多少数据,因为您不需要知道这些值是什么。因此,如果您的程序声明了2GB未初始化内存,则2GB不会影响可执行文件的大小,只有在加载后才能看到它。

嘿,Greg,谢谢您的回复。如果全局/静态变量被初始化,它存储在哪里?如果初始化很简单(比如一个数字),那么它通常存储在可执行文件(数据段)中。如果初始化更复杂(例如C++字符串),则代码在程序启动时运行以初始化值。因此,我还有一个问题,堆是在哪里存储的。它是数据段的一部分吗?不,堆不是数据段的一部分。堆是在运行时分配的。@GregHewgill那么为什么我们需要.bss段,在加载可执行文件之前,它都是零。在加载可执行文件之后,这些未初始化的全局数据的值应该在堆段中。为什么我们需要知道.bss需要多少数据,因为我们只是在运行时使用它?当加载程序时,它需要知道要分配多少内存。包括数据、bss和代码段的内存。