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. Android下创建一个SQLite数据库
  2. java 22 - 16 多线程之生产者和消费者的问题
  3. PAT-乙级-1031. 查验身份证(15)
  4. C#多线程(二)
  5. POJ 3169 Layout 差分约束系统
  6. 用vmware安装gho文件
  7. &lt;正向/反向&gt;最大匹配算法(Java)
  8. python远程批量执行命令
  9. 内功心法 -- java.util.ArrayList&lt;E&gt; (3)
  10. java网络编程之socket
  11. Android系统--输入系统(十五)实战_使用GlobalKey一键启动程序
  12. Vue自定义指令获取DOM元素
  13. Delphi 项目总结
  14. 金蝶k3密码批量修改
  15. Solidworks实例学习
  16. postgresql主从配置
  17. C# 导出Excel表格
  18. 编写脚本-SQL SERVER 用户权限分配
  19. MySQL锁系列之锁的种类和概念
  20. hiho_offer收割18_题解报告_差第四题

热门文章

  1. 关于奇妙的 Fibonacci 的一些说明
  2. 让 DolphinScheduler 1.3.4 开启 Netty 日志打印,解决流程实例一直在运行中的问题
  3. React报错之Encountered two children with the same key
  4. LuoguP3377 左偏树 (左偏树)
  5. python推导式与海象运算符
  6. 弹簧高跷题解---双向DP---DD(XYX)​​​​​​​的博客
  7. 使用RandomAccessFile实现数据的插入效果
  8. 【C标准库】详解strerror函数
  9. qt unknown type name编译报错记录
  10. centos7设置时间和上海时区并进行同步