计算机中堆栈的概念

这两天学习win32的API, 了解到了计算机中堆栈的概念,相信很多程序员有时候也弄不明白计算机中的堆栈的数据结构。再次为堆栈做一下详细解析。在英文中,我们管栈称为stack,管堆称为heap。在计算机中,堆栈是两种不同的数据结构,但堆栈均为一种按序排列的数据结构。只能在一端对数据项进行插入和删除。其中的关键是,堆,的排列顺序是随意的,而栈,排列顺序是先进后出(First In Last Out)。

堆:为编译器自动的分配与释放,用来存放函数的参数值与局部变量。其操作方式类似于数据结构中的栈。栈使用的是一级缓存,通常都是在调用时候存储于存储空间中,在用完后由编译器自动的释放。

堆: 为编程人员分配与释放,如果在程序结束的时候没有释放,一般会被OS所回收,分配方式类似于链表。堆一般存储于二级缓存。

数据结构, 堆可以被看成一棵树。栈则是一种先进后出的数据结构。

在具体介绍之前,我们应该介绍一下在C或者C++语言中变量的存储区域。

1,栈区(stack):这块区域由编译器分配与释放内存空间,一般存储函数的参数值与局部变量值。类似于数据结构中的栈。

2, 堆区(heap):这块区域由程序员自己分配与释放,其余数据结构中的堆是两码事,分配方式类似于链表。

3,全局区(静态变量区):这块存储区域用于存储全局变量(global)和静态变量(static),初始化的全局变量和静态变量存储于一块区域,未初始化的全局变量和静态变量存储于另一块区域。程序结束后系统自动释放。

4,文字常量区(静态缓冲区):这块区域用于存储常量静态字符串,在前面文章我有提到过并且演示过,用于存放const char*类型的变量。在程序运行中,是不可能对其进行修改的,如果修改的话,程序将会报错并且crush,程序结束后由系统自动释放。

5,程序代码区:该区域用于存放函数体的二进制代码。

下面,我用一段程序来解释在什么地方存放各种变量。


上面的例子完全诠释了各种变量存储的地方在程序中。

我们在申请空间的时候要注意的问题:

1,对于stack,如果我们申请的空间小于所剩余的空间,则系统会为其分配空间,如果大了的话,则会导致stack overflow,程序则会crush。

2,对于heap。 在计算机中,有一个记录空闲内存地址的链表,当系统收到申请的时候,系统就会遍历这个链表,寻找第一个大于申请内存空间的地址。之后便将这段内存分配给申请,同时会将这个节点从空闲内存节点中删除。值得一提的是,相对于大多数系统,会在这段内存空间的首地址记录本次分配内存的大小,因为这样,程序中的delete语句才可以正确的释放内存空间。同时,所分配的内存空间并不一定等于所申请的内存空间,再分配后,系统会将多余的内存重新加入内存空闲地址区域。

申请时应该注意的问题:在windows操作系统下,stack是一段由高地址向低地址扩展的连续内存,换句话说,也就是栈顶地址和栈的内存空间是系统设置好的。在大多数windows os中,栈的空间是2M,所以所申请的空间如果超过所剩余的栈的内存空间时候,栈就会overflow,程序就会报错。因此,能从栈中获得的内存空间较小。

相对于堆,堆是向高地址扩展的数据结构,是不连续的内存区域,为什么呢?因为系统使用链表进行存储的,必然不是连续的。堆的内存空间是受计算机中虚拟内存大小所控制的,因此用堆的话,获得的空间比较大,也比较灵活。

现在我们来讨论一下栈和堆申请内存的tradeoff:

1, 用栈申请内存的时候,有系统分配,速度较快,但是程序员没法直接控制。

2, 用堆申请内存空间的时候,分配内存空间相对来说较慢,但大小和销亡程序员可以控制,相对来说比较灵活,但是有时候容易产生内存碎片。

因此,具体问题具体分析,希望大家以后再写程序的时候,根据自己需求按照这两种规则进行不同的分配。

说了这么多,相信大家也有所了解了,同时大家再仔细的思考一下,函数退scope的时候也是按照这种规则的。马上临近春节了,在美国给大家拜个早年,蛇年快乐!

<think>嗯,用户想了解微型计算机堆栈的概念和作用。首先,我需要回忆一下堆栈的基本定义。堆栈是一种数据结构,遵循后进先出(LIFO)的原则,这在计算机科学中很常见。不过,用户特别提到的是微型计算机中的堆栈,所以可能需要结合硬件层面的实现来解释。 根据引用[1],微型计算机由微处理器、内存储器、输入/输出接口等组成。堆栈作为其中的一部分,可能涉及内存管理和寄存器使用。接下来,引用[2]和[3]提到堆栈指针(SP)的作用,管理堆栈操作,比如子程序调用和中断处理。这里需要明确堆栈在内存中的位置以及SP如何跟踪栈顶。 堆栈的概念部分应该包括其数据结构特性,比如LIFO,以及作为存储区的功能。作用方面,子程序调用时保存返回地址,中断处理保存现场,参数传递和临时变量存储都是关键点。需要确保引用相关的资料来支持这些点,比如引用[2]提到的中断处理,引用[3]提到的指针SP的运作。 另外,用户可能对堆栈的具体实现细节感兴趣,比如堆栈的生长方向(向上或向下),但根据引用[3],SP=0时是栈顶,这可能意味着堆栈从高地址向低地址增长,这在某些架构中常见。需要解释清楚这一点,避免混淆。 可能还需要比较堆栈和其他数据结构的区别,比如队列,但用户的问题集中在概念和作用,所以暂时不需要展开。不过,应该提到堆栈在微机系统中的重要性,如高效管理临时数据,确保程序流程正确。 最后,确保回答结构清晰,分点说明概念和作用,并引用提供的资料来增强可信度。同时,生成的相关问题要围绕堆栈的机制、与其他结构的对比、应用实例和SP的具体管理方法,帮助用户深入理解。</think>### 微型计算机堆栈的概念与作用 #### 一、堆栈的概念 堆栈(Stack)是微型计算机中一种基于**后进先出(LIFO)**原则的特殊存储结构,用于临时保存程序执行过程中的数据和地址。 1. **数据结构特性**:堆栈通过固定操作(压栈`PUSH`和弹栈`POP`)实现数据的存取,仅允许在栈顶进行操作[^3]。 2. **物理实现**:堆栈通常由**一段连续的内存空间**实现,通过**堆栈指针(Stack Pointer, SP)**动态指示当前栈顶位置。初始时,SP指向栈底(高地址),随着数据压入逐渐向低地址方向增长[^2][^3]。 #### 二、堆栈的作用 1. **子程序调用与返回** - 调用子程序时,CPU自动将**返回地址**压入堆栈,确保子程序执行完毕后能正确返回到主程序。 - 例如:`CALL`指令触发压栈操作,`RET`指令触发弹栈操作。 2. **中断处理** - 发生中断时,CPU将**程序状态字(PSW)**和关键寄存器内容压入堆栈,保存当前执行现场,中断结束后恢复现场[^2]。 3. **参数传递与临时变量存储** - 函数调用时通过堆栈传递参数,局部变量也存储在堆栈中,函数退出后自动释放。 4. **表达式求值与递归实现** - 编译器利用堆栈管理复杂表达式中的中间结果,递归函数则通过堆栈保存每一层调用的状态。 #### 三、堆栈的硬件支持 微型计算机通过**专用寄存器SP**管理堆栈: - **压栈(PUSH)**:SP先减量(向低地址移动),再将数据写入SP指向的位置。 - **弹栈(POP)**:从SP指向的位置读取数据,SP再增量(向高地址移动)[^3]。 例如,Intel 8086架构中堆栈操作示意图: ``` 初始状态:SP = 0xFFFE 执行 PUSH AX 后:SP = 0xFFFC,AX值存入0xFFFC~0xFFFD 执行 POP BX 后:SP = 0xFFFE,0xFFFC~0xFFFD的值加载到BX ``` #### 四、堆栈的典型应用场景 - **程序嵌套调用**:如多级函数调用。 - **实时系统中断响应**:快速保存和恢复上下文。 - **操作系统任务调度**:保存进程状态。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值