基础篇(原理)--- 堆栈知识

堆栈的基本操作(C语言实现) 堆栈就是栈通过数组的形式实现,我们都知道栈符合FILO即First In Last Out先进后出、后进先出的原则。栈顶指针top如果赋值-1,那么top指向栈顶元素;如果top赋值0,那么top指向栈顶上方的元素。下面我们来实现堆栈的基本操作(附有其他操作): 1.初始化 #include<stdio.h> #include<assert.h> #include<stdlib.h> typedef int STDataType; typedef struct St 阅读详情

目录

基础概念

栈中的数据

堆中的数据

堆栈的优缺点

堆栈溢出原因


基础概念

    JAVA在程序运行时,在内存中划分5片空间进行数据的存储。

    分别是:1:寄存器。2:本地方法区。3:方法区。4:栈。5:堆

    栈解决程序的运行问题,即程序如何执行,或者说如何处理数据

    堆解决的是数据存储的问题,即数据怎么放,放在哪儿

    所以说,栈是运行时的单位 , 而堆是存储的单元

    Java自动管理栈和堆,程序员不能直接地设置栈或堆

    JVM是基于堆栈的虚拟机.JVM为每个新创建的线程都分配一个堆栈

    也就是说,对于一个Java程序来说,它的运行就是通过对堆栈的操作来完成的

    堆栈以帧为单位保存线程的状态,JVM对堆栈只进行两种操作:以帧为单位的压栈和出栈操作

栈中的数据

    函数中定义的基本类型变量, 共有8种,即int, short, long, byte, float, double, boolean, char(注意,没有string)

    对象的引用变量,局部变量(定义在函数中的变量、定义在函数中的参数上的变量、定义在for循环内部的变量)

    都在函数的栈内存中分配,数数据一执行完毕,变量会立即释放,节约内存空间

    栈内存中的数据,没有默认初始化值,需要手动设置

    栈有一个很重要的特殊性,就是存在栈中的数据可以共享

    FILO先进后出,暂存数据的地方。每个线程都包含一个栈区!栈存放在一级缓存中,存取速度较快

    栈是限定仅在表头进行插入和删除操作的线性表

堆中的数据

    new创建的实例化对象及数组,是存放在堆内存中的,堆中数据不共享,只能有一个引用对象

    堆内存中所有的实体都有内存地址值,实体是用来封装数据的,这些数据都有默认初始化值

    当用完之后即实体不再被指向时,JVM启动垃圾回收机制不定期自动消除

    FIFO队列优先,先进先出。jvm只有一个堆区被所有线程所共享

    堆存放在二级缓存中,创建和销毁都要消耗更长的时间,所以速度相对慢一些

堆栈的优缺点

    堆的优点:编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间

      即可以动态的分配内存大小,生命周期不确定,因此,用堆保存数据时会得到更大的灵活性

    堆的缺点:堆里分配存储空间时会花掉更长的时间,速度慢,效率低

      堆不象栈是连续的空间,没有办法指望堆本身的内存分配能够象堆栈一样拥有传送带般的速度

    栈的优点:由于栈是从栈顶向上用就行,就好像工厂中的传送带一样,Stack Pointer会自动指引你到放东西的位置

      你所要做的只是把东西放下来就行.退出函数的时候,修改栈指针就可以把栈中的内容销毁.这样的模式速度最快

      栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短

    栈的缺点:栈中的数据大小和生命周期必须是明确的,缺少灵活性

堆栈溢出原因

    栈溢出:

  • 是否有递归调用
  • 全局变量是否过多
  • 数组、List、map数据是否过大
  • 指针或数组越界

    堆溢出:

  • 动态申请空间使用之后没有释放
  • 不断创建新的对象
【CPU】堆栈和堆栈指针(个人草稿) 什么是堆栈?堆栈(Stack)是一种后进先出(LIFO, Last In First Out)的数据结构,广泛用于计算机系统中,尤其是在程序执行过程中管理函数调用、局部变量、返回地址等。堆栈通常位于内存的特定区域,称为堆栈段或栈区。特性后进先出(LIFO):最后入栈的数据最先被弹出。自动管理:大多数编程语言和操作系统会自动管理堆栈的分配和释放,程序员不需要手动操作。快速访问:由于堆栈的操作(如压栈和弹栈)非常简单,因此访问速度较快。 阅读详情

相关推荐

用JAVA实现堆栈(链表篇)

什么是堆栈,关于这个名词,我在百度,google搜索了半天,也没有发现一个比较权威的解释,还有许多资料语焉不详,就以维基百科的解释为准吧,和我记忆中的一致。堆栈(英文:stack),中国大陆作堆栈,台湾作堆叠,在计算机科學中,是一種特殊的串列形式的資料結構,它的特殊之處在於只能允許在鏈結串列或陣列的一端(稱為堆疊頂端指標,英文為top)進行加入資料(push)和輸出資料(pop)的運算。另外堆

风亦飞的专栏 9441

22蓝桥杯训练6

小蓝实现了一个支持四种操作的栈: push:在栈顶压入一个元素, 新元素会置于原本的栈顶上方,成为新的栈顶。角谷猜想是指对于每一个正整数, 如果它是奇数,则对它乘 3 再加1 , 如果它是偶数,则对它除以2 , 如此循环,最终都能够得到1。该字符串一定是上述四个操作中的一个, 即 "push" , "pop" , "top" 和 "clear" 四种字符串中的一种(不包含引号)。输出一行,包含一个整数, [l,r]区间的数中得到1 的步骤最大的那个数。输出一行,包含一个整数,表示矩阵中最长线段的长度。

m0_73581206的博客 2034

SAP 物料账前期没有运行的解决方法

If you use the actual costing (material ledger), you must have completely closed all period-end closing operations in the actual costing for the penultimate period prior to the period shift. Use the '...

含笑饮砒霜死后更嚣张 3316

单片机堆栈知识总结

引用文章规律:出栈的每一个元素的后面,其中比该元素先入栈的一定按照入栈逆顺序排列。举例说明:已知入栈顺序: 1 2 3 4 5判断出栈顺序: 4 3 5 1 2结果:不合理,原因是出栈元素3之后有 5 1 2 这三个元素,其中1 2 是比3先入栈的,根据规律,这两个出栈的顺序必须和入栈顺序相反,也就是 2 1 出栈,不可能按照1 2 顺序出栈。已知入栈顺序: 1 2 3 4 5判断出栈顺序: 2 1 3 5 4。

weixin_44057803的博客 1万+

Vercel静态站被墙别慌!手把手教你用Cloudflare免费CDN+域名解析搞定DNS污染

本文详细介绍了如何利用Cloudflare免费CDN和域名解析解决Vercel静态网站遭遇DNS污染的问题。通过诊断DNS污染、设计Cloudflare解决方案架构、实战配置步骤以及高级调优技巧,帮助用户快速恢复站点访问并提升防护能力。

weixin_27442001的博客 677

PYNQ-Z2 开发板从镜像烧录到 Jupyter 交互全流程指南

本文详细介绍了PYNQ-Z2开发板从镜像烧录到Jupyter交互的全流程指南,包括硬件解析、镜像烧录技巧、设备启动与网络配置、Jupyter Notebook深度使用以及实战案例分享。通过具体步骤和实用技巧,帮助开发者快速上手PYNQ-Z2开发板,实现高效的FPGA开发和智能家居控制应用。

weixin_28736355的博客 438

【C语言】你必须知道的栈区细节—函数栈帧(动态详解)

该文章通过讲解函数栈帧的创建和销毁带你了解局部变量为什么是随机值,参数调用顺序等一系列问题

m0_75219751的博客 2643

【图文步骤】EC-Engineer部分操作详细步骤

EC-Engineer部分功能详细使用手册

weixin_42212468的博客 6164

保护你的代码!深入解析随机堆栈偏移技术

通过引入随机性,它使得堆栈布局变得不可预测,从而增加了恶意攻击者利用缓冲区溢出等攻击手段来突破软件安全防御的难度。随机堆栈偏移通过引入随机性,改变了堆栈布局的可预测性。具体而言,随机堆栈偏移对函数的局部变量和缓冲区分配了随机的地址空间,使得攻击者无法确定需要覆盖的返回地址的具体位置。通过引入随机性,它有效地增加了攻击者突破软件安全防御的难度,并提高了软件的抵御能力。随机堆栈偏移技术的发展和应用,为构建更加安全可靠的软件系统提供了坚实的基础。然而,这样的堆栈布局容易受到攻击者的破坏。

m0_72410588的博客 430

5分钟搞定!用Keil MDK将STM32F103C8T6工程无缝迁移到ZET6开发板

本文详细介绍了如何在Keil MDK环境下快速将STM32F103C8T6工程迁移到ZET6开发板,涵盖硬件差异对比、工程配置调整、外设适配及编译排错等关键步骤,帮助开发者5分钟内完成工程移植,大幅提升开发效率。

weixin_30879169的博客 408

SRA数据库

简介 序列读取存档(sequence Read Archive,SRA)数据是可通过多个云提供商和NCBI服务器获得的,它是最大的可公开获得的高通量测序数据存储库。 SRA接受来自生活各个部门以及宏基因组学和环境调查的数据。 SRA存储原始测序数据和比对信息,以提高可重复性并通过数据分析促进新发现。 NCBI网站储存二代测序原始数据的数据库 SRA官网 从Entrez搜索结果中下载SRA序列 例如查找SRA Entrez中BALB / c小鼠淋巴结组织的RNA-Seq记录 获取搜索结果 SRA se

qq_44520665的博客 5907

ARM 汇编基础教程系列

ARM 汇编基础教程系列 第 1 部分:ARM 汇编简介 第 2 部分:数据类型寄存器 第 3 部分:ARM 指令集 第 4 部分:内存指令:加载和存储数据 第 5 部分:加载和存储多个 第 6 部分:条件执行和分支 第 7 部分:堆栈和函数 ...

HURUWO的技术博客 707

TCP报文 Flood攻击原理与防御方式

TCP交互过程中包含SYN、SYN-ACK、ACK、FIN和RST报文,这几类报文也可能会被攻击者利用,海量的攻击报文会导致被攻击目标系统资源耗尽、网络拥塞,无法正常提供服务。接下来我们介绍几种常见的Flood攻击的原理和防御方式。

qq_32044265的博客 4219

Unity3D 实用技巧 - 基础知识大全集(二)

上一篇:Unity3D 实用技巧 - 基础知识大全集(一)高阶内容Part1:C#代码类1、C#和C++的区别?简单的说:C# 与C++ 比较的话,最重要的特性就是C# 是一种完全面向对象的语言,而C++ 不是,另外C# 是基于IL 中间语言和.NET Framework CLR 的,在可移植性,可维护性和强壮性都比C++ 有很大的改进。C# 的设计目标是用来开发快速稳定可扩展的应用程序,当然也可...

unityofficial的博客 118

CentOS7下用FreeRADIUS+AD实现802.1X认证完整指南(附华为交换机配置)

本文提供了在CentOS 7系统上部署FreeRADIUS并与Windows Active Directory集成,以实现企业级802.1X网络认证的完整实战指南。内容涵盖从架构原理、服务器配置(包括Kerberos、Samba Winbind集成)、FreeRADIUS核心设置与AD联动,到华为交换机的详细配置步骤。重点解决了生产环境中常见的高可用、动态VLAN下发及深度排错问题,为企业构建集中、安全的网络准入控制体系提供了经过验证的解决方案。

weixin_29273849的博客 406

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

计算机组成原理笔记(十三)——3.3堆栈与堆栈操作

SP修改方向:自底向上时进栈先减,出栈后增。数据保存顺序:LIFO特性决定现场恢复的正确性。内存与寄存器堆栈的适用场景:高速缓存场景用硬件堆栈,大容量需求用软件堆栈。

2301_79318558的博客 2213

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

微机原理:8086/8088堆栈操作

微机原理中8086/8088处理器堆栈知识讲解

m0_58773352的博客 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

深入分析MCU堆栈的作用,以及该如何设置堆栈大小

置顶/星标公众号,不错过每一条消息 前段时间分享文章《从嵌入式编程中感悟「栈」为何方神圣?》之后,很多朋友问了关于堆栈的问题。今天就写点相关内容,让大家进一步了解堆栈的知识。1写在...

李肖遥的专栏 2895

微机原理 18-堆栈操作指令

堆栈是按照LIFO原则组织的一段内存区域。(“先进后出”,或说“后进先出” ) 80X86规定堆栈设置在堆栈段内。用SS段寄存器记录其段地址 用SP始终指向堆栈的顶部。 栈顶:堆栈的顶部。即最后推入堆栈的信息所在的单元。 栈顶随着数据出栈、入栈而变化。 生长方向:栈顶的变化方向。分向下生长和向上生长两种。 8086中的堆栈是向下生长的。即栈顶向地址码小的方向生长。 ...

imxlw00的专栏 1万+

堆栈原理

我们常常说堆栈堆栈,但是堆和栈其实是完全不同的两个概念。栈其实完全是为了函数调用而设计的,那么函数调用如何通过栈实现的呢?不同函数调用方式,栈在行为上有什么区别呢? 系统栈的工作原理: 1、内存的不同用途: 如果您关注网络安全问题,那么一定听过缓冲区溢出这个术语。简单说来:**缓冲区溢出就是在大缓冲区中的数据向小缓冲区复制的过程中,由于没有注意小缓冲区的边界,“撑爆”了较小的缓冲区,从而冲掉了和...

qq_45521281的博客 3744

《FreeRTOS任务基础知识篇》

FreeRTOS任务基础知识。

zhz_java的博客 988

堆栈计算机的原理和实现

堆栈计算机的原理和实现 原书《 Stack Computers: the new wave 》 (原书封面) 原作者 Philip J. Koopman, Jr. 编译者 赵宇 张文翠 这是第一本讨论新一代堆栈计算机的书,而实现这种体系结构的第一块芯片是 Novix 公司的NC4016芯片。本书作者从堆栈如何被用于计算开始,对过去和现在大约 70 多个堆栈计算机进行分类,并对其中的7个堆栈计算机进

Forth语言编程专栏 2万+

esp32 怎么分配freertos 堆栈大小_FreeRTOS学习笔记——FreeRTOS 任务基础知识

  RTOS 系统的核心就是任务管理,FreeRTOS 也不例外,而且大多数学习RTOS 系统的工程师或者学生主要就是为了使用RTOS 的多任务处理功能,初步上手RTOS 系统首先必须掌握的也是任务的创建、删除、挂起和恢复等操作,由此可见任务管理的重要性。由于任务相关的知识很多,所以接下来我们将用几章的内容来讲解FreeRTOS 的任务。本章先学习一下FreeRTOS的任务基础知识,本章是后...

weixin_39692172的博客 1501

堆栈溢出从入门到提高

转自:http://www.jiaonan.net/html/2007/06/20070624034620915.htm入门篇 2007-6-24 15:46:20本讲的预备知识: 首先你应该了解intel汇编语言,熟悉寄存器的组成和功能。你必须有堆栈和存储分配方面的基础知识,有关这方面的计算机书籍很多,我将只是简单阐述原理,着重在应用。其次,你

cnctloveyu的专栏 1万+

JVM 线程堆栈分析过程详解

在这篇文章里我将教会你如何分析JVM的线程堆栈以及如何从堆栈信息中找出问题的根因。在我看来线程堆栈分析技术是Java EE产品支持工程师所必须掌握的一门技术。在线程堆栈中...

田维常 1523

单片机基础知识(微机原理和堆栈知识)

程序存储”:指令以代码的形式事先输入到计算机的主存储器中,然后按其在存储器中的首地址执行程序的第一条指令,以后就按该程序的规定顺序执行其他指令,直至程序执行结束。即按地址访问并顺序执行指令CPU=控制器 + 运算器CPU的工作,我的理解是:先通过首地址,然后根据时序,执行和读取下一步程序,存储下一步地址,和存储数据,并通过指令相应的将程序执行,例如汇编语法中,地址的数据移到数据寄存器。通用寄存器会记录当前PC和地址和数据信息(这里指的是寄存器)

weixin_45806361的博客 370
上一篇: 数据库篇(数据库设计) ---权限系统设计
下一篇: 基础篇(原理)--- 多线程
Coder_Light
博客等级 码龄9年 30粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值