考虑以下代码:
#include<stdio.h>
int a=0;
int main()
{
//some code
}
我了解到静态变量的物理内存绑定是在加载时完成的。什么时候为“a”完成内存绑定?它存储在哪里,在堆栈区还是静态区?
考虑以下代码:
#include<stdio.h>
int a=0;
int main()
{
//some code
}
我了解到静态变量的物理内存绑定是在加载时完成的。什么时候为“a”完成内存绑定?它存储在哪里,在堆栈区还是静态区?
正如已经指出的那样,一般行为取决于平台,因此没有普遍有效的答案,但在大多数现代“正常”系统上,编译器会.data
在生成的目标文件中生成一个包含初始化值的部分您定义的变量。
然后,当您启动程序时,程序加载器将该.data
部分直接从可执行文件内存映射到新创建的进程的虚拟内存中,供您的程序读取和写入(可能使用一些 COW 方案来保留每个进程' 复制私人)。
您使用的术语“内存绑定”不是正常术语的一部分,所以我不确切知道您在问什么,但这也许有帮助?
编译时,编译器知道“a”是一个全局变量,并将“a”放入可执行文件的数据部分。在那个区域,可执行文件记录了“a”的虚拟地址。并且当可执行文件被加载到操作系统中运行时,并且在运行过程中使用了“a”,操作系统会将物理地址映射到“a”的虚拟地址。可执行文件的其余代码只需要知道“a”的虚拟地址就可以访问它,操作系统会做映射并到物理内存进行读/写。而“a”的虚拟地址是由编译器在编译时确定的。
如需更多知识,《计算机系统:程序员的视角》一书是一个很好的来源。
a
是在静态存储中,因为它是全局的。只有函数的局部变量在堆栈上。
您也可以static
在函数中使用关键字来使该变量的存储类型为静态。
但是,static
关于全局变量有不同的含义(因为它们已经是静态存储类型):变量的符号不会导出到目标文件中,因此该变量将无法从其他模块(.c 文件)直接访问。