c语言内存简析

首先来看一个可执行文件在磁盘存储的时候文件组成,size a.out:

可以看到a.out文件分为,代码区,数据区,未初始化数据区3个部分。

代码区

程序被操作系统加载到内存的时候,所有的可执行程序(程序代码指令,常量字符串)都被加载到代码区,这个块内存在运行期间是不变的,函数是代码的一部分,也被放在代码区。

全局初始化数据区/静态数据区

包含了程序中明确被初始化的全局变量,静态变量(包括全局和局部)和常量数据

未初始化数据区

也称作BSS区,存放的是全局未初始化变量。

运行时c程序占用的内存分为代码区,初始化数据区,未初始化数据区,堆区和栈区五个部分。

对比图如下:

栈区(stack)

由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。栈的存取速度快于堆区。

堆区(heap)

用于动态分配内存,一般由程序员手动申请和释放。分配方式类似于链表。

下面介绍下栈的四种类型:

满减栈,满增栈,空减栈,空增栈

满空栈的区别在于当前指针所在的位置是否有东西。

满栈,指针指向最后压入栈的数据,数据入栈是,sp先减(加)一在入栈。

空栈,指针指向下一个将要放入数据的位置,数据入栈时,先入栈sp再减(加)一。

增减栈的区别,根据栈的生长方向不同。

递增栈:栈有低地址向高地址生长。

递减栈:栈由高地址向低地址生长。

ARM处理器支持这四种堆栈的工作方式。

猜你喜欢

转载自blog.csdn.net/u011821510/article/details/85388470