首先来看一个可执行文件在磁盘存储的时候文件组成,size a.out:
可以看到a.out文件分为,代码区,数据区,未初始化数据区3个部分。
代码区
程序被操作系统加载到内存的时候,所有的可执行程序(程序代码指令,常量字符串)都被加载到代码区,这个块内存在运行期间是不变的,函数是代码的一部分,也被放在代码区。
全局初始化数据区/静态数据区
包含了程序中明确被初始化的全局变量,静态变量(包括全局和局部)和常量数据
未初始化数据区
也称作BSS区,存放的是全局未初始化变量。
运行时c程序占用的内存分为代码区,初始化数据区,未初始化数据区,堆区和栈区五个部分。
对比图如下:
栈区(stack)
由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。栈的存取速度快于堆区。
堆区(heap)
用于动态分配内存,一般由程序员手动申请和释放。分配方式类似于链表。
下面介绍下栈的四种类型:
满减栈,满增栈,空减栈,空增栈
满空栈的区别在于当前指针所在的位置是否有东西。
满栈,指针指向最后压入栈的数据,数据入栈是,sp先减(加)一在入栈。
空栈,指针指向下一个将要放入数据的位置,数据入栈时,先入栈sp再减(加)一。
增减栈的区别,根据栈的生长方向不同。
递增栈:栈有低地址向高地址生长。
递减栈:栈由高地址向低地址生长。
ARM处理器支持这四种堆栈的工作方式。