计算机中堆栈的概念

2023-05-16

这两天学习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, 用堆申请内存空间的时候,分配内存空间相对来说较慢,但大小和销亡程序员可以控制,相对来说比较灵活,但是有时候容易产生内存碎片。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机中堆栈的概念 的相关文章

  • 欢迎使用CSDN-markdown编辑器

    ADB操作命令及其详解 adb是什么 xff1a adb的全称为Android Debug Bridge xff0c 就是起到调试桥的作用 通过adb我们可以在Eclipse中方面通过DDMS来调试android程序 xff0c 说白了就是
  • 私有云上创建与配置虚拟机

    目录 一 登录私有云 二 创建网络 新建路由等 xff08 一 xff09 创建网络 hy 二 新建路由 xff08 三 xff09 添加接口 xff08 四 xff09 查看网络拓扑 xff08 五 xff09 添加端口 三 创建实例 x
  • 远程桌面打开mayavi,基于VirtualGL + Turbovnc

    实现内容 xff1a 远程桌面打开mayavi xff0c 基于VirtualGL 43 Turbovnc 参考链接 xff1a 链接1 下面是复制过来的内容 xff0c 附加上我的注释 xff1a Setup VirtualGL and
  • twisted笔记三:當Deferred遇上Thread(转载)

    Deferred不會自動實現將阻塞過程轉為非阻塞過程 xff0c 雖然它已經有那樣的機制但還是要你去多走一步 要將阻塞過程轉為真正的非阻塞過程 xff0c 那麼只有借用線程 但至於線程調用你不用太擔心 xff0c twisted已為你準備好
  • pyspider安装与初次使用的那些坑

    pyspider是一个python的爬虫框架 xff0c 安装过程遇到不少坑 xff0c 在这里总结一下 安装 安装只需要简单用pip安装就可以了 pip install pyspider 测试 使用 pyspider 或 pyspider
  • FreeRTOS学习笔记(二)——内核机制

    文章目录 0x01 临界段Cortex M内核快速关中断指令关中断开中断进入和退出临界段的宏进入临界段退出临界段临界段代码应用 0x02 空闲任务与阻塞延时的实现空闲任务的创建实现阻塞延时阻塞等待总结 0x03 多优先级通用方法 xff1a
  • scrapy并发爬虫

    通过CrawlerProcess import scrapy from scrapy crawler import CrawlerProcess class MySpider1 scrapy Spider Your first spider
  • pyqt5使用pyinstaller打包项目为exe

    一 打包 1 生成index spec pyinstaller F w i logo ico index py 不显示cmd pyinstaller F c i logo ico index py 建议先用 c xff0c 这样如果打包不成
  • freshclam更新clamav病毒库失败(connection failed)

    有大佬能帮帮我吗 xff1f
  • 查杀linux服务器木马,定时查杀病毒并隔离

    接收到了阿里云服务器的安全告警 xff0c 主要文件是 usr bin sshd root aa xff0c 使用以下三种方法解决 一 使用clamav 一 xff09 下载 下载方式 xff1a xff08 1 xff09 下载压缩文件
  • 外部传参的3种方式

    运行jar包时 xff0c 希望通过外部传参并获取 xff0c 框架为spring boot xff0c 有3种方式解决 前两种需要设置环境变量 spring boot 的 64 Value 64 Component public clas
  • 批量替换文件名为指定日期并删除.svn文件

    bin bash cur date 61 34 96 date 43 Y m d 96 34 cur date 61 2 批量替换该文件夹下的所有文件日期为指定日期 function replace name for file in 96
  • log4j2内置变量

    问题概述 xff1a 在log4j2 xml中中想通过 变量名 直接获取变量 xff0c 但是直接输出了 符 xff0c 并没有获取到项目中的变量 目录 一 log4j2官方配置 二 常见变量 1 bundle配置文件 2 sys系统变量
  • 构建Docker容器集群(九)

    Docker容器集群构建 使用自定义网桥连接跨主机容器 Docker默认的网桥是docker0 它只会在本机连接所有的容器 举例来说容器的虚拟网卡在主机上看一般叫做veth 而docker0网桥把所有这些网卡桥接在一起 xff0c 如下所示
  • ubuntu虚拟桌面

    用户可以自定义启动号码如 xff1a vncserver 2 注意 2前面一定要有空格 杀死vncserver进程 vncserver kill 1 这里你启动vncserver时是什么端口号要对应上 1 第一种方法 xff1a 使用geo
  • markdown编辑希腊字母

    字母名称大写markdown原文小写markdown原文alphaAA alphabetaBB betagamma Gamma gammadelta Delta deltaepsilonEE epsilon varepsilonzetaZZ
  • Linux下WRF Domain Wizard使用教程(PART2: 使用教程及 遇到的种种BUG)

    当用命令run DomainWizard打开WRFDW后 如图所示 第一步 第一栏是你的虚拟机的名称 第二栏是WPS所在的目录 第三行是WPS所需要的静态地理数据的位置 第四栏是你WRFDW项目存放的位置 这里我新创建了个domain 点击
  • Keras学习之tensor张量

    本文参考Keras中文官方网站 xff1a http keras cn readthedocs io en latest other regularizers tensor 张量 指的是指广泛的数据类型 xff0c 它是 n n 维的 n
  • 栈和排序

    题目描述 给你一个1 gt n的排列和一个栈 xff0c 入栈顺序给定 你要在不打乱入栈顺序的情况下 xff0c 对数组进行从大到小排序 当无法完全排序时 xff0c 请输出字典序最大的出栈序列 输入描述 第一行一个数n 第二行n个数 xf

随机推荐

  • ubuntu系统samba共享权限设置,一清二楚

    samba共享设置 在root权限下 xff0c 进入root权限的方法 su或者 sudo su root 创建系统用户 useradd m user 设置用户密码 passwd user 创建smb密码 smbpasswd a user
  • curl安装

    一 xff1a windows下安装curl 1 下载windows版本curl安装包 根据你电脑的系统选择32位或64位 因为我的电脑是64位的 所以我选择64位的安装包 curl下载地址 xff1a https curl haxx se
  • OAuth 2.0 概念及授权流程梳理

    本文可以转载 xff0c 但请注明出处https www cnblogs com hellxz p oauth2 process html OAuth2 的概念 OAuth是一个关于授权的开放网络标准 xff0c OAuth2是其2 0版本
  • 基于51单片机的12864液晶时钟C语言程序

    自己写的12864液晶时钟程序 xff0c 经过验证可以使用 xff0c 希望可以为初学者作为参考 include lt reg52 h gt include lt math h gt define uint unsigned int de
  • 耗时两个月开发的弯管机三维模型自动转档软件

    一 系统简介 SmartPipe软件根据用户提供的三维实体管子数据 xff08 stp iges brep文件 xff09 xff0c 通过全自动方式 xff0c 提取管子的轴线数据及几何特征信息 xff0c 生成弯管编程所需的xyz数据以
  • 软件评测-软件测试与软件质量

    软件测试与软件质量 软件测试 xff1a 经典的定义是在规定条件下对程序进行操作 xff0c 以发现错误 xff0c 对软件质量进行评估 因为软件是由文档 数据 及程序组成 xff0c 所以软件测试应该是对软件形成过程的文档 数据以及程序进
  • sobol敏感性分析 matlab代码

    sobol 参数敏感性分析 参考 xff1a csdn https blog csdn net xiaosebi1111 article details 46517409 wiki xff1a https en wikipedia org
  • 软件质量的8个特性

    功能性 功能完备性 功能正确性 功能适用性 性能效率 时间特性 资源利用率 容量 兼容性 共存性 互操作性 易用性 可辨识性 易学性 易操作性 用户差错 防止性 用户界面 舒适性 易访问性 可靠性 成熟性 可用性 容错性 可恢复性 信息安全
  • Bad configuration option: \302\240

    ssh 配置文件时奇奇怪怪的错 xff0c 我碰到的是 xff1a Bad configuration option 302 240 一直不清楚后面这个 302 240 是啥意思 xff0c 后来参考这个回答 xff1a https sta
  • CentsOS系统卡值mysql查询慢

    第一步查看系统是什么占资源 htop F1 h 查看htop使用说明 xff0c F2 s 设置选项 F3 搜索进程 F4 过滤器 xff0c 输入关键字搜索 F5 t 显示属性结构 F6 lt gt 选择排序方式 F7 减少进程的优先级
  • 精美多功能翻页时钟源码 灵感来源于fliqlo

    介绍 xff1a 一个翻页时钟的网页 xff0c 灵感来源于fliqlo 外表相似 xff0c 功能不同 功能 xff1a 看时间看秒表倒计时 说明 xff1a F11 全屏 ctrl 43 43 或 调整设置框大小 单击 或 空格 可以暂
  • vscode 报错ERROR: Unable to start debugging. Unexpected GDB output from command “-exec-run“

    1 报错信息 Unable to start debugging xff0c 如下截图所示 网上找了很多资料 xff0c 发现大部分解释都说是 xff0c 库的问题 xff0c 拷贝libstdc 43 43 6 dll 文件后 xff0c
  • 关于Ip首部最大长度(60)和最小长度(20)的计算

    第一次写博客 xff0c 可能语言组织的不是特别好 xff0c 因为是个人理解 xff0c 有不正确的地方清指出 关于ip首部长度最大值5字节和60字节的计算 首先声明几个单位 ip数据报中的单位是 位 xff08 代表 32bit xff
  • Dev-C++ 5.11 调试程序 查找程序错误

    相信大家看到我这篇博客的时候还不怎么会用dev c 43 43 调试程序吧 xff0c 那么我就给大家详解一下 xff08 切记 xff1a 要调试的程序一定要能够通过编译 xff0c 一定要通过 xff0c 一定要通过 xff0c 一定要
  • NVM安装与使用

    NVM安装与使用 介绍 nvm是nodejs的版本管理工具 xff0c 可以安装和切换不同的版本nodejs npm是依赖包的管理工具 1 下载NVM GITHUB https github com coreybutler nvm wind
  • maven

    http mvnrepository com 打开网面 xff0c 搜索要查询的jar包名 xff0c 直接复制配制文件到你自己的pom xml中即可 xff0c 如 xff1a lt dependency gt lt groupId gt
  • 密集脚集成块的手工焊接方法

    电子爱好者在进行电子设计制作时 xff0c 最头痛的是焊接密集脚贴片集成块 如 VS1003的焊接 xff0c 往往感到无从下手 下面根据我设计制作时的经验 xff0c 将具体的手工操作方法介绍给大家 xff0c 希望能助你一臂之力 所需辅
  • python批量新建文件、批量保存图片、批量创建文件夹

    python批量新建文件 批量保存图片 批量创建文件夹 新建文件 xff1a 假设我要新建10个txt文件 for i in range 10 这里的 指代的是当前文件夹 i表示文件的名称 f 61 open 39 s 39 i 43 39
  • 操作系统——实验一.进程管理

    include 34 conio h 34 include 34 stdio h 34 include 34 stdlib h 34 struct jincheng type int pid int youxian int daxiao i
  • 计算机中堆栈的概念

    这两天学习win32的API xff0c 了解到了计算机中堆栈的概念 xff0c 相信很多程序员有时候也弄不明白计算机中的堆栈的数据结构 再次为堆栈做一下详细解析 在英文中 xff0c 我们管栈称为stack xff0c 管堆称为heap