首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >全局变量是如何存储的?

全局变量是如何存储的?
EN

Stack Overflow用户
提问于 2010-11-03 01:46:43
回答 3查看 12.3K关注 0票数 6

AFAIK,有两种类型的全局变量,初始化和未初始化。它们是如何储存的?它们都存储在可执行文件中吗?我可以想到初始化的全局变量,将它们的初始值存储在可执行文件中。但是,对于未初始化的那些,需要存储什么呢?

我目前的理解是:

可执行文件被组织成几个部分,例如.text、.data和.bss。代码存储在.text部分,初始化的全局或静态数据存储在.data部分,未初始化的全局或静态数据存储在.bss部分。

谢谢你抽出时间看我的问题。

更新1-9:2010年3月11日上午56

我在这里找到了一个很好的参考资料:

Segments in Assembly Language Source - Building the text and data segments with .text, .data, and .bss directives

更新2-10:2010年3月11日上午09

@Michael

我在汇编代码中定义了100个字节未初始化的数据区域,这100个字节没有存储在我的可执行文件中,因为它不是initialized.

  • Who,它将在内存中分配100字节未初始化的内存空间?程序加载器

假设我得到了以下代码:

代码语言:javascript
复制
int global[100];

void main(void)
{
   //...
}

global100没有初始化。如何在我的可执行文件中对global100进行编码?谁会在什么时候分配?如果它被初始化了呢?

EN

回答 3

Stack Overflow用户

发布于 2010-11-03 02:06:22

在PE文件中,为每个段指定了两个大小: RAWsize (磁盘上的大小)和Vsize (内存中的大小)。

Vsize大于RAWsize时,内存中其余的段将为零。

.bss (如果存在的话)的RAWsize总是为0,并且非尼亚化的全局变量位于那里。

另一种常见的方法是使Vsize of .data大于其RAWsize,这样段的其余部分将包含统一的变量。

票数 3
EN

Stack Overflow用户

发布于 2010-11-03 02:06:58

全局变量的存储是在程序加载时由OS链接器/加载器在计算机虚拟内存中分配的。实际的全局变量存储位于物理内存层次结构(缓存、RAM内存、SSD/HD备份存储等)中,这是由缓存和VM系统映射的。这一切可能最终都会变得支离破碎。

初始化的全局值从.data段复制到分配的虚拟内存的一部分。非初始化的全局值可能是零的,或者可能有垃圾留在它们中,这取决于运行程序的特定操作系统的安全性。

这些是其他的变体,取决于语言、编译器、语言运行时和操作系统.

票数 2
EN

Stack Overflow用户

发布于 2010-11-03 01:53:27

未初始化的变量只是机器级别上的指针。它们的空间是在运行时分配的,程序将在稍后的某个时候填充它。

例如,如果在汇编程序中创建一个全局变量global BYTE 100,它将保留global作为指向100字节区域的指针。然后,该程序可以访问该地区的任何需要。

编辑:我在我的汇编程序书中查找,它看起来就像初始化变量一样,在.data部分中定义了未初始化的全局值。根据我的理解,这个空间是在exe中分配的(如上面所说的100个字节),但是会有未定义的内容。在Windows中的Intel机器上,它将是垃圾;程序负责初始化它。希望这能有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4083612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档