2013-09-28 105 views
0

考虑下面的代码:全局变量(存储器绑定)

#include<stdio.h> 
int a=0; 

int main() 
{ 
//some code 
} 

我了解到,物理内存静态变量的结合是在加载时进行。 何时完成'a'的内存绑定?它存储在哪里,在堆栈区域还是静态区域?

+0

这是平台相关的。 –

+0

@奥利查尔斯沃斯你可以给一个直觉,为什么这样呢? – ishan3243

+0

由于内存,变量等的排列不是由C语言定义的。 –

回答

0

a静态存储,因为它是全球。只有本地函数的变量位于堆栈上。

您可以在函数中使用static关键字来使该变量的存储类型也是静态的。但是,全局变量上的static具有不同的含义(因为它们已经是静态存储类型):变量的符号不会被导出到对象文件,因此该变量将不能直接从其他模块访问(。 c文件)。

+0

虽然这是最常见的行为,但这不是强制性的。编译器/平台在存储方面可以自由地做任何事情。 –

2

正如已经指出的那样,一般行为是依赖于平台的,因此没有普遍有效的答案,但是在大多数现代的“正常”系统中,会发生什么情况是编译器在生成的目标文件中生成一个.data部分,包含您定义的变量的初始化值。

当您启动程序时,程序加载程序将内存映射到可执行文件的.data部分到新创建的进程的虚拟内存中,可供您的程序读取和写入(可能使用一些COW计划,以保持每个进程的复制私人)。

您使用的术语“内存绑定”不是正常术语的一部分,所以我不确切地知道你在问什么,但这可能有帮助吗?

+0

通过内存绑定我的意思是当一个变量被分配实际物理内存的时间。 – ishan3243

+0

在这种情况下,我认为我的答案是:在程序加载时。尽管严格来说,它当时只被分配了虚拟内存。严格来说,现代系统只会在实际上通过触摸它来分页时分配物理内存(并且如果您从未写入但只读取它,则您的进程可能永远不会获得分配的独占内存,因为该部分可能是与其他进程共享)。 – Dolda2000

0

编译时,编译器知道“a”是全局变量,并将“a”放入可执行文件的数据部分。在该区域中,可执行文件记录“a”的虚拟地址。当可执行文件加载到操作系统中运行时,并且在运行期间使用“a”时,操作系统会将物理地址映射到“a”的虚拟地址。可执行文件的其余代码只需要知道“a”的虚拟地址就可以访问它,操作系统将执行映射并进入物理内存进行读写操作。编译期间编译器确定“a”的虚拟地址。

欲了解更多的知识,本书“计算机系统:程序员的视角”是一个很好的来源。