Linux下32位环境的用户空间内存分布:
Linux下64位环境的用户空间内存分布:
前面讲到,在64位环境下,虚拟地址虽然占用64位,但只有最低48位有效。故从0000800000000000~FFFF800000000000,棕色FFFF所代表的这十六位就变成了无效区域(未定义)。
程序代码区用来保存函数体的二进制代码指令,常量区用来存放const和字符串,全局数据区存放全局变量和静态变量。它们在程序加载到内存后就分配好了,并且在程序运行期间一直存在(大小已被固定),所以这些常量和变量在程序的任何地方都能被访问,因为其内存一直都在。
常量区和全局数据区有时也被合称为静态数据区,意思是这段内存专门用来保存数据,在程序运行期间一直存在。
函数被调用时,会将参数、局部变量、返回地址等与函数相关的信息压入栈中。执行结束后,就会放弃对它们的使用权(大概率就将被销毁)。这个过程由系统自动分配和释放,程序员唯一能够控制的内存区就是堆(Heap)。它是虚拟地址中的一大块内存空间,程序可以申请一块内存自由使用,并且在主动释放之前会一直存在,不随函数的结束而失效。需要提一嘴:栈区是从上往下增长,而堆区是从下往上增长。也就是说,在栈中先定义的局部变量地址会较大、后定义的局部变量地址会较小~由大到小,依次减小。而堆中分配的变量则是先分配的地址较小,后分配的地址较大。
标签:函数,局部变量,模式,编译,地址,64,内存,分配 From: https://www.cnblogs.com/mikewzp/p/17471234.html