- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
Possible Duplicate:
What and where are the stack and heap
我有几个关于堆栈与堆的问题。
要知道的基本知识是堆栈比堆快,但有限制。 (如果我错了,请纠正我)。
但是,我一直想知道堆栈和堆究竟是如何工作的。 RAM只是一 block 内存,它不分为“堆栈”和“堆”(或者是吗?)。如果是这样,为什么我们首先要在堆栈和堆中拆分内存?
操作系统可以让我们能够分配堆栈上的所有内容 -> 一切都变得更快 -> 快乐的世界?
我很确定情况并非如此。但为什么!?谁能给我一个深入的答案?
对不起,如果这篇文章是某个人曾经发布过的某个帖子的副本,那么与堆栈和堆相关的内容太多了,我找不到确切的问题。如果您碰巧知道一个,请继续链接它。
最佳答案
堆栈:堆栈用作一种临时暂存器,供当前正在执行的代码块使用,任何 block 称为当前代码块,以及任何 block 称为该代码块,并且很快。当当前 block 退出时,它使用的局部变量被遗忘。顾名思义,堆栈以后进先出的方式使用。
堆栈最重要的用途之一是跟踪当前的调用链。当一个函数调用另一个函数时,调用者将下一条指令的地址(返回地址)压入堆栈。当每个函数退出时,它将调用者的返回地址从堆栈中弹出,并继续执行从该地址开始的代码。它还用于在调用者和被调用者之间传递函数参数和返回值。
堆:堆是不同的——它没有特定的顺序。如果你想在一个代码块中分配内存并且让那个内存粘在 block 的末尾之外,你可以在堆上分配它。当然,您还需要在某处存储指向它的指针/引用,以便其他代码可以找到该内存;大多数语言都为此提供了便利。
速度:速度差异不是由于内存本身的任何属性 - 正如您在问题中所说,堆栈和堆通常都位于相同的物理内存中。由于堆栈的 LIFO 特性,在堆栈上分配空间很快:如果您将某些东西插入堆栈,它只能在一个位置结束。相比之下,在堆上分配 block 需要在内存中找到足够大的连续空闲区域。堆栈分配可以像一条指令一样快;堆分配需要调用像 malloc()
这样的内存分配函数。
静态v.动态 在堆上分配内存是动态的——是否分配 block , block 的大小,可以根据程序在运行时接收到的输入来确定。如果需要,甚至可以调整堆上分配的内存区域的大小。 也可以在堆栈上动态分配内存(参见 C 标准库函数 alloca()
),但是一旦当前函数退出,该内存就会丢失.堆栈分配通常是静态的——编译器确定(非寄存器)参数、返回数据和局部变量需要多少空间,并在调用函数时生成代码以在堆栈上保留必要的空间。
示例:假设您正在创建一个文字处理器。您无法提前知道文档有多大,甚至无法知道同时使用多少文档。同时,您希望用户的文档保留在内存中,只要用户希望它们保持打开状态。如果您尝试为堆栈上的文档分配内存,您会发现很难同时打开多个文档,您需要创建一个函数来创建、编辑、保存和关闭文档。在堆上分配空间允许您创建任意数量的文档,每个文档的大小都适合其包含的数据,并避免将文档的生命周期与任何特定函数的生命周期联系起来。
总结:简而言之,堆栈保存变量的值(有时使用寄存器代替),而堆用于分配将在当前 block 的生命周期之后使用的内存.
关于memory - 为什么内存要分成栈和堆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8173353/
栈一种常见的特殊线性数据结构,其特殊之处在于其操作顺序,下面会详细介绍,也正因为其特性,因此栈可以轻松解决表达式求值、括号匹配、递归算法、回溯算法等等问题。 01、定义 栈的特殊性表现为操作受
目录 实践1 —— 从字符串中移除星号 栈和数组存储数据的方式一样,它们都只是元素的列表。不同之处在于栈的以下3个限制: 数据只能从栈末插入; 数据只
准备工作 工具:idea+jdk8 技术要求:java基础语法 编码环节 首先,我们得先确定下来,用什么数据来模拟栈的操作。由于是一个一个的元素放入栈里面,我们可以考虑用数组来实现。
0. 学习目标 栈和队列是在程序设计中常见的数据类型,从数据结构的角度来讲,栈和队列也是线性表,是操作受限的线性表,它们的基本操作是线性表操作的子集,但从数据类型的角度来讲,它们与线性表又有着巨大的不
在可以使用递归(在堆栈中存储状态)和对象创建(在堆中创建新对象)的场景中。 问题 在对象创建和递归之间进行选择时应考虑哪些参数? 我的研究得出以下结论(需要验证这一点) 当可用内存较少时:使用递归 可
下面是我编写的用于检查内存对齐的示例程序。 Pavan@Pavan-pc:~/working_dir/pavan/C$ cat mem3.c #include #include
Instapaper 和 Twitterrific 等应用启动的 View 不是其导航堆栈的 Root View 。我们知道这一点,因为初始 View 已经有一个后退按钮。 Instapaper 推出
有没有办法在调试或正常运行期间的某个时刻可视化 Activity 堆栈? 最佳答案 您可以通过 Activity 管理器获取一些有用的信息。 ActivityManager manag
我想编写一个应用层协议(protocol),在发送 GET 请求时使用 TCP 返回特定的 ASCII 文本。我读了第一HTTP specification和 the SMTP specificati
1、堆和栈的速度性能分析 堆和栈是jvm内存模型中的2个重要组成部分,自己很早以前也总结过堆和栈的区别,基本都是从存储内
一: 概念 栈,同样是一种特殊的线性表,是一种last in first out(lifo)的形式,现实中有很多这样的例子,
java中stack类继承于vector,其特性为后进先出(lastinfirstout). 入栈和出栈实例图: 实例图的java代码实例: ?
1、单链表 1、在我们数据结构中,单链表非常重要。它里面的数据元素是以结点为单位,每个结点是由数据元素的数据和下一个结点的地址组成,在java集合框架里面 LinkedList、Ha
本文实例讲述了Python编程实现双链表,栈,队列及二叉树的方法。分享给大家供大家参考,具体如下: 1.双链表 ?
我一遍又一遍地阅读定义,但我仍然不明白ARM中的SP和LR是什么?我了解PC(它显示下一条指令的地址),SP和LR可能类似,但我只是不明白它是什么。你能帮我一下吗? 编辑:如果你能用例子来解释它,那就
我必须使用索引 0 作为堆栈的顶部,并且在实现此操作时遇到问题。我得到了所有 null,但输出 100、200 和 300 是我得到的唯一数字。我忽略的实现有什么问题吗? push 方法应该实现 Ar
我正在用 Java 解决汉诺塔问题。我选择使用 Stacks 作为钉子,除了 move 方法之外,一切都正常。我有规范和 JUnit 测试类,目前通过了 7 项测试中的 6 项,但在移动测试中失败了。
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Does this type of memory get allocated on the heap or
首先,抱歉我的英语不好。我将尝试解释我的问题: 我有一个 RootViewController(基于导航的项目)。因此,它显示了表格 View ,当用户选择表格的一行 (didSelectRowAtI
我有一个看起来像这样的类 class A { int b; void B() { int c; } } int main() { A asdf;
我是一名优秀的程序员,十分优秀!