你了解堆和栈的由来吗?

news2024/9/26 1:20:32

人们提出内存中堆和栈这两个概念,肯定是要解决当时所遇到的问题,不会为了提出概念而提概念。堆和栈都是为了解决一些问题而发展出来的结果,并没有任何的高深之处。

要搞懂堆和栈的概念是如何来的,就需要从计算机诞生时说起了。

在冯诺依曼提出冯诺依曼计算机时,那是只有存储器,没有将存储器进一步划分。在编程时,整个内存空间任你使用,随便写,整个地址空间,每一个比特都是全局变量。

但时间久后,人们发现,这样写出来的代码真的很难维护、难以让人理解,写出来的代码都是面条代码。

后来,为了解决面条代码的问题,ALGOL提出了结构化编程。每个模块都使用begin和end进行包裹,包裹的部分使用局部变量,不能引用全局变量。

这时,科学家们又遇到了新的问题,在包裹的部分,如何才能实现局部变量呢?

当进入到每个模块时,为这个块单独开辟一块内存空间,。块空间是可以进行嵌套,比如A函数调用B函数,B函数调用C函数。这种嵌套有个特点,最后执行的块,一定是最先执行完成,最先释放空间,然后依次执行和释放。你会发现这就是我们现在所使用的栈,后进先出,即Last-In-First-Out数据结构。

这就是栈的由来,也是结构化编程的结果。

栈最早是体现在计算伯努利数的程序中,由程序员师姐ada编写,大致思路就是从仓库中获得数据,然后计算,然后将结果返回仓库。

结构化编程在上世纪60~70年代很流行,也逐渐被大众所接受,但是又带来了新的问题,这种大量的Push和Pop操作,很容易影响程序执行效率。

为了提高程序执行效率,DEC率先在CPU中增加了四条指令,分别是Push、Pop、PushJ、PopJ;后来出现的CPU,几乎都是遵照了这种范式,一直延续到今天。

下面再来说说堆

我们知道,最早的高级语言是Fortran,这门语言现在还在TIOBE排行榜前十的位置,还是很受欢迎的。早期的Fortran,必须在内存中定义好维度和长度,用今天的话来讲,就是在编译时使用静态变量将空间分配好,不支持在运行时进行动态分配。

如果你今天使用这种语言进行开发,不知道你会换多少个键盘和鼠标。我想你一定会疯掉的,这是什么垃圾玩意。当时的开发人员当然也不爽,严重影响到开发效率。

为了解决这一问题,在上世纪60年代初,BCPL语言首次引入了堆的概念,提供GETBLK和FREEBLK两个函数,用于动态申请内存空间,终于不用在代码里将数据定死了。

在到后来的C语言,就是我们都使用过的malloc和free函数。

这就是堆,为了能让你在运行时才决定内存大小的分配,而不必在编译时就将大小定死。堆并不能准确指代什么,而是一种泛指,泛指操作系统给你一块内存空间存放你任意的东西,不要与数据结构中的堆混合了。

堆和栈是不同的,大多数语言栈上的数据大小在编译期就必须要确定的。当你在类或函数中定义变量时,就是在使用栈;当你使用malloc或new时,就是在使用堆。

我上面说的堆和栈只是一些概念,仅供了解,当你具体在使用堆和栈时,肯定还会有很多细节之处。比如。栈的长度能无限大吗?栈的大小由什么决定?在堆里频繁申请和释放内存,如何减少内存窟窿?如何提高效率?每次malloc后,又要free,这一过程不仅繁琐而且又不安全,有没有在程序运行时自动对内存进行申请和释放(也就是现在的GC)。

如果你对这些基本概念进行理解后,在去理解这些细节就很简单了,没有你想象中的那么难。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1992790.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UE中的运行时Mesh - 学习笔记

UE中的运行时Mesh Runtime Mesh 广泛应用于仿真、游戏及医疗等相关应用领域。 运行时Mesh可以摆脱UE编辑器的依赖,独立开发相对独立的应用程序。 应用示例 地质领域: 模型编辑修改:膨胀 导入、材质设置、补洞及简化: mar…

【Java】韩顺平Java学习笔记 第23章 反射

文章目录 需求和快速入门反射原理反射相关主要类反射的优点和缺点及其优化Class类Class类常用方法获取Class类对象的六种方式有Class对象的类型 类加载动态加载和静态加载类加载时机类加载流程图类加载五个阶段加载阶段连接阶段-验证连接阶段-准备连接阶段-解析总结Initializat…

【Bug记录】operator->返回类型错误导致operator->调用不了

项目场景: 模拟list,出现operator->调用不了的情况,这是什么情况呢??? 问题描述 这里我是明确写了operator->函数的: 但是却有下面报错: 原因分析: 这里有…

python判断和循环语句

python判断语句 1、单个条件判断 if 条件:满足条件要做的事情1满足条件要做的事情2 else:不满足条件要做的事情3不满足条件要做的事情2 2、多个条件判断(满足条件1就不会判断条件2) else可以省略不写 if 条件1:满足条件1要做的事情a满足条件1要做的事…

JavaEE从入门到起飞 (三) ~AOP

晚上好,愿这深深的夜色给你带来安宁,让温馨的夜晚抚平你一天的疲惫,美好的梦想在这个寂静的夜晚悄悄成长。 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 了解面向切面编程(AOP&#xf…

牛客网每日刷题之 HJ99.自守数(C++)

在不断学习的过程中也不能忘记了基础知识的巩固,在学习新的知识后要学会去举一反三,前不久我刚刚了解了一些关于 string 类的知识,对牛客网的 自守数 有了新的解题思路,让我们一起看看这道题吧 思路解析 a. 整数方法 1. 首先我们知…

C++(2):λ表达式,类函数重载

λ表达式 [&]捕获前面所有 [i] j闭包函数内访问不了,在函数内i只能用不能改 [&I,j] i在函数内可改j不行 未捕获可以充当函数指针使用 new,delete和malloc,free区别 new会调构造函数 malloc不会,delete会调析构函数free不会malloc调用需要强转…

从混沌到秩序:一本书教你掌握互联网内容审核与信息安全的密钥

随着互联网技术的迅猛发展,视频、图片、文字等多媒体内容以前所未有的速度在全球范围内传播与分享,极大地丰富了人们的信息获取渠道和娱乐生活方式。然而,这一繁荣景象背后,也隐藏着内容安全、版权侵犯、虚假信息传播、不良内容泛…

公司邮箱办理流程复杂吗?三步快速开通公司邮箱

对于许多企业而言, 开通公司邮箱是一项重要的基础建设工作。但是, 很多企业主可能会担心这一过程是否过于繁琐。实际上, 只需要注册、设置域名和邮箱, 以及开始使用这三个步骤。本文将为您介绍如何通过Zoho邮箱快速完成公司邮箱的开通。 Zoho邮箱因其卓越的服务质量和可靠性, …

数据传输为什么占用空间变大了

最近在做数据备份,很尴尬的是,不到3T的数据,用一个4T的硬盘拷贝中转到存储服务器上发现放不下。特别是以小文件为主的标注文件的文件夹,几十M几百M变成几十G或者100多G的空间占用。下面是几张图。 ​ ​ ​ 服务器之间拷贝占用空间…

Linux初启征程指南:攻克常见系统指令与权限初理解

有时候觉得,电脑就像一个高贵冷艳的妹纸。 400,是她冷冰冰地说:“我听不懂你在说什么”; 401,是她无情地转身:“我不认识你,别说那些奇怪的话”; 403,是她残酷的拒绝&…

Mysql-窗口函数二

文章目录 1. 前百分之N的问题 排名 row_number1.1 需求1.2 准备工作1.3 分析1.4 实现 2. 前百分之N的问题 ntile2.1 介绍2.2 语法2.2.1 示例2.2.2 结果示例2.2.3 注意事项 2.3 需求2.4 分析2.5 实现 3. 前百分之N的问题 百分比 PERCENT_RANK3.1 语法3.1.1 示例3.1.2 注意事项 3…

函数的练习

1.判断一个数是否为素数 代码如下&#xff1a; #include <stdio.h> int jum(int num) {int i 0;for (i 2;i < num;i){if (num % i 0){return 0;break;}}return 1; }void Jum1(int (*pf)(int)) {int num 0;printf("请输入操作数&#xff1a;");scanf_s…

声压、声强、响度之间的区别与联系

声压、声强、响度是声学中描述声音特性的重要概念&#xff0c;它们之间有一定的关系&#xff0c;但分别反映了不同的物理或感知特性。 1、声压&#xff08;Sound Pressure&#xff09; 声压是声波传播时在介质中引起的压力波动&#xff0c;通常以帕斯卡&#xff08;Pa&#x…

Windows电脑下载安装Kodcloud可道云结合内网穿透秒变私有网盘

文章目录 1.前言2. Kodcloud网站搭建2.1. Kodcloud下载和安装2.2 Kodcloud网页测试 3. cpolar内网穿透的安装和注册4. 本地网页发布4.1 Cpolar云端设置4.2 Cpolar本地设置 5. 公网访问测试6.结语 1.前言 本文主要为大家介绍一款国人自研的在线Web文件管理器可道云&#xff0c;…

苹果手机数据被抹除还能恢复吗?这两个方法强烈推荐

苹果手机数据被抹除还能恢复吗&#xff1f;我们在使用苹果手机时&#xff0c;有时由于误操作、系统故障或升级失败等原因&#xff0c;导致手机照片、备忘录、视频、联系人等数据被意外抹除。 面对这类情况&#xff0c;我们应该怎么办&#xff1f;下面牛小编给大家的分享2个方法…

CH07_数据绑定

第7章&#xff1a;数据绑定 本章目标 理解路由事件 掌握键盘输入事件 掌握鼠标输入事件 掌握多点触控输入事件 数据绑定概述 什么是数据绑定 ​ 将WPF中的至少一个带有依赖项属性的两个对象的两个属性进行绑定&#xff0c;使某一个依赖项属性可以更新和它绑定的属性的功…

奥尔特曼在X上发了颗“草莓” 网友疯狂猜测:这难道是GPT新模型?

ChatGPT开发商OpenAI的首席执行官山姆奥尔特曼&#xff08;Sam Altman&#xff09;在社交媒体X上发布了一张花园里自种草莓的照片后&#xff0c;引发了众多网友的热议&#xff0c;是否新的GPT模型即将上线&#xff1f; 周三&#xff08;8月7日&#xff09;&#xff0c;奥尔特曼…

海量数据处理商用短链接生成器平台 - 8

第十八章 短链服务-分库分表多维度查询解决方案《钻石玩法》 第1集 短链服务-短链URL跳转302跳转接口开发实战 简介&#xff1a; 短链URL 跳转302跳转接口开发实战 需求 接收一个短链码解析获取原始地址302进行跳转 编码实战 Controller Slf4j public class LinkApiControl…

搭建时空基底,建设“数字之城”

在这个日新月异的时代&#xff0c;数字技术正以前所未有的速度重塑我们的世界。今天&#xff0c;让我们一同深入探讨如何通过搭建时空基底&#xff0c;为“数字之城”的建设奠定坚实基础。 一、时空基底&#xff1a;数字之城的骨骼与脉络 所谓“时空基底”&#xff0c;是指结…