首页 > 应用开发 > > 关于程序的内存的分布规则,很多老程序猿都不知道
编程老大叔
现在很多的高级语言真的是对程序猿十分的友好了,不用怎么去操心系统底层的问题,比如内存分配管理这些,只需要去考虑业务逻辑的实现就好了。但是想要成为一个顶尖高手,底层的一些知识是必须的。今天就给大家分享下关于我们写好的程序在运行时他的内存是怎么分配的
1、系统空间划分
每个程序运行起来以后,它将拥有自己独立的虚拟地址空间。这个虚拟地址空间的大小与操作系统的位数有关系。例如32位硬件平台的虚拟地址空间的地址可以从0~2^32-1,即0x00000000~0xFFFFFFFF,总共4GB大小。在32位Windows操作系统中,高地址的2GB位内核空间,用户空间只有2GB,而32位Linux的内核空间只有1GB,用户空间有3GB大小。而64位操作系统,用户可用空间则要大的多。
好,废话不多说直接上图:
那么每个区都存哪些数据呢?
代码区: 存储机器码序列/全局常量/代码/字符串常量
全局区: 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另 一块区域。 程序结束后由系统释放。
未初始化数据段[.bbs]: 未初始化的全局变量/未初始化的(局部/全局)静态变量(static修饰的变量).
堆(从低地址往高低至增长): 所使用的局部变量还是在栈上,内容则在堆上.手动释放或者程序结束时由操作系统释放回收。由程序员分配[new/malloc/realloc/calloc]。windows下, 申请的堆空间一般小于2GB。
栈(从高地址往低地址增长): 局部变量/局部常量(const)[局部只读变量]/函数调用时返回地址/调用者的环境信息(例如某些机器寄存器)。
我们对应着代码来看更直观:
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/1978/viewspace-3140308/ ,如需转载,请注明出处,否则将追究法律责任。