C++代码在编译完成后会生产.exe程序(windows平台), .EXE以文件的形式存储在磁盘上,当运行.exe程序的时候
操作系统会将磁盘上的.exe文件加载到内存中,那么在加载到内存中的时候,操作系统是如何在内存中存放这个exe程序的?
有没有区域的划分?那么是如何划分的?
首先需要了解一点,程序加载到内存中,是不能直接加载到物理内存中的

现在我们以 X86平台的Linux 环境举例
当我们一个程序(进程)在启动执行时,操作系统会为其分配一个4G(2的32次方)的内存空间(就是进程的虚拟内存地址空间)

如下图内存分配图

点击查看代码
#incclude <iostrea>
using namespace std;

int gdata1=1;
int gdata2=0;
int gdata3;

static int gdata4=10;
static int gdata5=0;
static int gdata6;
int main(){
	
	int a=100;
	int b=0;
	int c;
	
	static  int d=1000;
	static  int e=0;
	static  int f;	
	return 0;	
}

如上面代码中的全局变量
gdata1,gdata2,gdata3,gdata4,gdata5,gdata6
无论是普通的还是静态的,他们都叫”数据”,每一个数据在编译后,在符号表中都会产生符号.
gdata1和gdata4 初始化了的,而且值部不为0,所以存储在.data段
gdata2和gdata5 初始化了,但是值为0,所以存储在.bss段
gdata3和gdata6 未初始化,存储在.bss段

main 函数中的 a,b,c 不是数据,不会在符号表中产生符号,他们编译只产生指令
例如:move dword prt[a], och ,他们是存储在.text段,当程序运行到这里时,他们是在栈上分配空间的

对于静态的局部变量 如 d,e,f 也是数据,存放在数据段,也会在符号表中产生符号,
程序启动的时候不会初始化,而是在第一次运行到的时候才会初始化, d存储在.data段,e,f存储在.bss段

打印C的值,是一个栈上的随机值,打印f,由于存储在.bss段,系统会负责为.bss段做初始化,置0,所以打印出来f为0

上面红框部分存储在代码段,蓝色框部分存储在数据段

注意:不同的进程之间,用户空间是私有的,内核空间是共享的

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性