Questions tagged «stack»

LIFO(后进先出)数据结构。

6
Java中的堆栈和堆内存
据我了解,在Java中,堆栈内存保存了原语和方法调用,而堆内存则用于存储对象。 假设我有一堂课 class A { int a ; String b; //getters and setters } a类中的基元A将存储在哪里? 为什么堆内存根本存在?为什么我们不能将所有内容都存储在堆栈中? 当对象被垃圾回收时,与对象相关联的堆栈是否被破坏?

7
为什么调用堆栈具有静态的最大大小?
使用过几种编程语言后,我一直想知道为什么线程堆栈具有预定义的最大大小,而不是根据需要自动扩展。 相比之下,在大多数编程语言中发现的某些非常常见的高级结构(列表,地图等)被设计为在添加新元素时根据需要增长,其大小仅受可用内存或计算限制的限制(例如32位寻址)。 我不知道任何编程语言或运行时环境,其中最大堆栈大小不受某些默认或编译器选项的限制。这就是为什么太多递归会很快导致普遍存在的堆栈溢出错误/异常的原因,即使仅将进程可用内存的最小百分比用于堆栈。 为什么大多数(如果不是全部)运行时环境为堆栈在运行时可以增长的大小设置了最大限制?
46 stack 

6
使用两个队列实现堆栈的意义何在?
我有以下作业问题: 使用两个队列实现堆栈方法push(x)和pop()。 我觉得这很奇怪,因为: 堆栈是(LIFO)队列 我不明白为什么您需要两个队列来实现它 我到处搜寻: 极客 堆栈溢出 并找到了一些解决方案。我最终得到的是: public class Stack<T> { LinkedList<T> q1 = new LinkedList<T>(); LinkedList<T> q2 = new LinkedList<T>(); public void push(T t) { q1.addFirst(t); } public T pop() { if (q1.isEmpty()) { throw new RuntimeException( "Can't pop from an empty stack!"); } while(q1.size() > 1) …
34 java  stack 

6
如果可以内联嵌套函数调用,为什么程序要使用调用堆栈?
为什么不让编译器采用这样的程序: function a(b) { return b^2 }; function c(b) { return a(b) + 5 }; 并将其转换为这样的程序: function c(b) { return b^2 + 5 }; 从而消除了计算机记住c(b)的回信地址的需要? 我认为存储程序并支持其编译所需的硬盘空间和RAM分别增加,这就是我们使用调用堆栈的原因。那是对的吗?

3
为什么堆栈向下生长?
我假设有历史,但是堆栈为什么向下增长? 在我看来,像缓冲区溢出将是一个很大很难利用如果堆栈向上增长...
31 cpu  stack 

1
帧指针说明
在MIPS程序集中,有一个寄存器用于堆栈指针,另一个寄存器用于帧指针。什么是帧指针,其目的是什么?它与堆栈指针有何不同?
28 assembly  stack 

6
如果可以在堆栈上更高效地完成所有工作,我们为什么需要堆?
这实际上与我昨天问的问题有关,为什么今天使用的应用程序同时需要堆栈和堆(以及为什么不能只使用堆而不同时使用堆,为了拥有简单的&唯一标准)。 但是,许多响应表明堆栈是不可替代的,这是因为与尝试分配/引用堆相比要快数百(或数千)倍。我知道,如果不使用Heap,动态存储分配就会出现问题,但是没有办法解决这一问题,或者没有办法在Stack上进行改进以使其能够处理动态内存分配吗?
24 stack  heap 

4
为什么将某些东西放在堆栈上称为“推”?
根据http://dictionary.reference.com 推 动词(与宾语一起使用) 用力压迫或压迫(事物)以将其移开。 通过施加力以特定的方式移动(某物);推; 开车:把东西推开;推开门。 通过推开障碍来实现或完成:通过人群。 使延伸或投射;推力。 敦促或敦促采取某种行动或方针:他的母亲强迫他找工作。 该IMO适合FIFO队列。对此有解释吗?

4
多少堆栈使用量过多?
最近,当我编写C或C ++时,我会在堆栈上声明所有变量,只是因为它是一个选项,与Java不同。 但是,我听说在栈上声明大的东西是个坏主意。 为什么会这样呢?我认为涉及到堆栈溢出,但是我不清楚原因为何。 堆栈上有多少东西太多了? 我不是想将100MB的文件放在堆栈上,而只是将十几个千字节数组用作字符串缓冲区或其他任何东西。这是堆栈使用过多吗? (对不起,如果有重复,搜索堆栈时会不断引用堆栈溢出。甚至没有调用堆栈标记,我只是使用了抽象标记。)

2
操作系统如何限制堆栈和堆的大小?
注意:如果您需要考虑特定的操作系统才能回答问题,请考虑使用Linux。 每当我运行一个程序时,都将为其分配一个虚拟内存空间,其中有一个用于堆栈的区域,一个用于堆栈的区域。 问题1:堆栈和堆是否有静态大小限制(例如,每个大小为2 GB),还是该限制是动态的,根据程序执行期间的内存分配而变化(即,总共4 GB供用户使用)两者兼而有之,因此,如果程序仅使用堆栈,那么它将能够具有4 GB的堆栈)? 问题2:如何定义限制?它是总可用RAM内存吗? 问题3:文本(代码)和数据部分如何处理,如何限制它们?
21 linux  memory  stack  heap 

4
了解C / C ++中的函数调用堆栈框架吗?
我试图了解如何构建堆栈框架以及哪些变量(参数)以什么顺序被压入堆栈?一些搜索结果表明,C / C ++编译器根据函数内执行的操作进行决策。例如,如果假定该函数只是将传入的int值加1(类似于++运算符)并返回它,则它将把该函数的所有参数和局部变量放入寄存器中。 我想知道哪些寄存器用于返回或按值传递参数。引用如何返回?编译器如何在eax,ebx,ecx和edx之间进行选择? 我需要了解什么才能了解​​函数调用期间如何使用,构建和销毁寄存器,堆栈和堆引用?
19 c++  c  compiler  stack 

4
没有TCO时,什么时候需要担心堆叠失败?
每次都针对以JVM为目标的新编程语言进行讨论,不可避免地会有人说: “ JVM不支持尾调用优化,因此我预计会有很多爆炸式堆栈” 该主题有成千上万的变体。 现在,我知道某些语言(例如Clojure)具有可以使用的特殊递归结构。 我不明白的是:缺少尾部呼叫优化有多严重?我什么时候应该担心呢? 我感到困惑的主要根源可能是因为Java是有史以来最成功的语言之一,而且相当多的JVM语言似乎运行得很好。这怎么可能,如果缺乏TCO的是真的任何关注?

2
摊销分析?(最坏情况下的性能保证)
什么是摊销分析?以及它如何帮助我在程序中实现最坏情况的性能保证? 我正在阅读以下技术可以帮助程序员获得最坏情况的性能保证(即,用我自己的话说:保证程序的运行时间不会超过最差转换的运行时间): 随机算法(例如,在最坏的情况下,快速排序算法是二次方的,但是对输入进行随机排序可以保证其运行时间是线性的概率) 操作顺序(我们的分析必须同时考虑数据和客户端执行的操作顺序) 摊销分析(提供绩效保证的另一种方法是通过跟踪所有工序的总成本除以工序数来摊销成本。在这种情况下,我们可以允许一些昂贵的工序,同时保持平均成本换句话讲,通过将一部分费用分配给大量廉价操作中的每一项,我们分散了一些昂贵操作的成本) 作者提到将调整数组数据结构的大小用于Stack作为如何实现摊销分析的一个示例,但我仍然不明白什么是摊销分析,以及如何实际实现(摊分分析?铸造性能保证

5
在嵌入式系统中为单个阵列分配大量堆栈有缺点吗?
我通常可以毫无疑问地确定某些数据是全局的,静态的还是在堆栈上(这里没有动态分配,因此不使用堆)。我也看过几个Q / A如这一个,但我的问题是更具体的,因为它涉及到比较系统内存中的数据,庞大的数额巨大。 我正在尝试改进的现有代码(设计,可能出现的问题,性能等)。该代码在只有4KB RAM的旧8位MCU上运行。在这段代码中,我将使用几乎1KB的数组(是的,在4KB RAM系统上为1KB)。使用此数组的每个字节,这不是问题。问题在于此数组是文件在其中声明的静态数组,因此其生命周期与程序之一相同(即可以视为无限)。 但是,在阅读了代码之后,我才发现该数组不需要无限的生命周期,它是以完全过程性的方式构建和处理的,因此我们应该只能在使用它的函数中声明它,这样,它将在堆栈上,因此我们将节省此1KB RAM。 现在的问题是:这是个好主意吗?从设计的角度来看,如果不需要无限/全局生命周期,则它属于堆栈。但是,嘿,这是4KB中的1KB,这样分配25%的RAM是否没有任何缺点?(可能是堆栈的50%或更多) 有人可以在这种情况下分享经验吗,还是有人在考虑是否有任何合理的理由不将此数组放在堆栈中?我正在寻找技术缺陷以及对设计的评论。 我唯一意识到的是,进入此功能时,我必须确保实际上有1KB的可用堆栈。也许这就是我必须采取的所有措施,也许不是。

1
红色区域的目的是什么?
红色区域是内存中超出“未分配”堆栈指针的固定大小区域。编译器确实会生成汇编程序,以通过简单的叶函数访问该区域。 但是我看不出红色区域有任何真正的优势。在堆栈指针之外访问内存确实很危险,并且很容易导致数据损坏。为什么还要这样做?保存2条处理器指令(push ebp; mov ebp esp)不会真正提高速度。
12 assembly  stack 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.