关于程序的内存的分布规则,很多老程序猿都不知道

嵌入式ARM 2019-11-15 10:56

来源 :今日头条@编程老大叔


现在很多的高级语言真的是对程序猿十分的友好了,不用怎么去操心系统底层的问题,比如内存分配管理这些,只需要去考虑业务逻辑的实现就好了。但是想要成为一个顶尖高手,底层的一些知识是必须的。今天就给大家分享下关于我们写好的程序在运行时他的内存是怎么分配的


1、系统空间划分


每个程序运行起来以后,它将拥有自己独立的虚拟地址空间。
这个虚拟地址空间的大小与操作系统的位数有关系。例如32位硬件平台的虚拟地址空间的地址可以从0~2^32-1,即0x00000000~0xFFFFFFFF,总共4GB大小。在32位Windows操作系统中,高地址的2GB位内核空间,用户空间只有2GB,而32位Linux的内核空间只有1GB,用户空间有3GB大小。而64位操作系统,用户可用空间则要大的多。
好,废话不多说直接上图:


那么每个区都存哪些数据呢?

  1. 代码区: 存储机器码序列/全局常量/代码/字符串常量
  2. 全局区: 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另 一块区域。 程序结束后由系统释放。
  3. 未初始化数据段[.bbs]: 未初始化的全局变量/未初始化的(局部/全局)静态变量(static修饰的变量).
  4. 堆(从低地址往高低至增长): 所使用的局部变量还是在栈上,内容则在堆上.手动释放或者程序结束时由操作系统释放回收。由程序员分配[new/malloc/realloc/calloc]。windows下, 申请的堆空间一般小于2GB。
  5. 栈(从高地址往低地址增长): 局部变量/局部常量(const)[局部只读变量]/函数调用时返回地址/调用者的环境信息(例如某些机器寄存器)。

我们对应着代码来看更直观:

-END-


推荐阅读

【01】LabVIEW编程还可以这么简单?
【02】老兵传奇:聊聊我在华为的20年
【03】嵌入式C语言高手炼成之内存操作篇
【04】Linux内存使用的体会
【05】我是一名程序员,站在程序员的角度来谈谈Linux内存的使用


免责声明:整理文章为传播相关技术,版权归原作者所有,如有侵权,请联系删除
嵌入式ARM 关注这个时代最火的嵌入式ARM,你想知道的都在这里。
评论
热门推荐
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦