编译原理(2): 程序在内存中的分布

这里介绍的内存位置是程序对应的虚拟内存, 然后通过编译原理(0)我们知道,操作系统会把虚拟内存地址映射到物理内存地址。

局部变量,函数形参----存于(stack);

new出来的变量--------存于堆区(heap); 

全局变量,静态变量----存于数据区;

函数代码----------------存于代码区;

Tips:

         1、经过编译和链接阶段后,函数变成了二进制字节码,存放在低地址的代码区,可以认为这个时候的函数的虚拟内存地址是固定的了。 

          2、经过编译和链接阶段后,全局变量和静态变量的地址也是固定的 

          3、new出来的对象放在Heap区,从起始的低地址---->高地址一个个的排,理论上,只要有内存,可以一直生成。

         4、局部变量、形参在Stack区,从起始的高地址 -----> 低地址一个个排,Stack空间固定,如果数据过大就会栈溢出,造成程序崩溃。

                                

高地址
┌───────────────────────────────┐
│           Kernel Space        │ (内核空间,用户程序不可访问)
├───────────────────────────────┤
│                               │
│           Stack (栈)          │ ↓ 由高地址向低地址增长
│                               │
├───────────────────────────────┤
│               ↓               │
│                               │
│               ↑               │
│                               │
│           Heap (堆)           │ ↑ 由低地址向高地址增长
├───────────────────────────────┤
│                               │
│   Memory Mapping Segment      │ (动态库、文件映射等)
│   (mmap)                      │
├───────────────────────────────┤
│                               │
│           BSS (未初始化数据)   │ .bss(初始化为0)
│                               │
├───────────────────────────────┤
│                               │
│           Data (已初始化数据)  │ .data(显式初始化)
│                               │
├───────────────────────────────┤
│                               │
│           Text (代码区)        │ .text(只读,存放机器指令)
│                               │
└───────────────────────────────┘
低地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值