堆叠和堆肥是什么?它们实际上位于计算机的内存中在哪里?它们在多大程度上被操作时间或语言控制?它们的范围是什么?它们的大小是什么?它们大小是什么?一个的大小是什么使一个更快?


当前回答

当在加载代码和数据设置后创建进程时, 在数据结束和基于架构的地址空间顶端堆叠后, 启动一个进程, 然后在装入代码和数据设置后启动堆放

当需要更多堆积时, os 将会动态分配, 而堆积块总是几乎毗连

请见 brk ()、 sbrk () 和 ALloca () 系统在 Linux 中调用

其他回答

来自Wikianwser。

堆叠堆叠

当函数或方法调用一个函数或方法调用另一个函数,而该函数轮流调用另一个函数等时,所有这些函数的履行将一直暂停,直到最后一个函数返回其值。

此挂起函数调用链链是堆叠, 因为堆叠( 功能调用) 中的元素互相依赖 。

在处理例外情况和处决线索时,堆叠很重要。

堆肥

堆积仅仅是存储变量的程序所使用的内存。 堆积( 变数) 元素不互相依赖, 随时可以随机访问 。

您可以用堆叠做一些有趣的事情。例如,您有像 Alloca(假设您能够通过关于堆叠使用的大量警告)这样的功能,这是一种形式的中转器,专门用堆叠而不是堆叠来记忆。

也就是说,基于堆叠的内存错误是我经历过的最糟糕的内存错误。 如果您使用堆积内存, 并且越过分配区块的界限, 您有触发断段故障的好机会 。 ( 不是100%: 您的区块可能附带地与先前分配的区块相毗连 。) 但是由于堆叠上创建的变量总是相互连结, 写出边框可以改变另一个变量的值 。 我了解到, 只要我感觉到, 只要我感觉到它, 就会改变另一个变量的值 。

在以下 c 代码中

public void Method1()
{
    int i = 4;
    int y = 2;
    class1 cls1 = new class1();
}

下面是内存的管理方式

本地变量只要在堆栈中进行函数调用, 只需持续时间。 堆积层的堆积层用于那些我们并不真正了解其一生的变量, 但是我们期望这些变量会持续一段时间。 在大多数语言中, 关键是我们在编译时知道一个变量有多大, 如果我们想将其存储在堆叠中的话 。

对象(在更新时大小不同) 继续堆积, 因为我们不知道在创建时它们会持续多久。 在许多语言中, 堆积是垃圾, 以寻找不再有任何引用的对象( 如 cls1 对象) 。

在 java 中, 大多数对象会直接进入堆积。 以 c / c++、 structs 和 class 等语言, 当您不与指针打交道时, 通常会留在堆叠中 。

更多信息,请访问 :

堆叠和堆积内存分配的差别 Timmurphy.org

此处 :

在堆叠和堆放上创建对象

本条是上述图象的来源:六种重要的.net概念:堆叠、堆肥、价值类型、参考类型、拳击和开箱-代码项目

但要知道它可能含有一些不准确之处。

简单的说, 堆栈是创建本地变量的地方。 另外, 每次您调用一个子例程, 程序计数器( 下个机器指令的指针) 和任何重要的注册器, 有时参数会被推到堆栈上。 然后子例程内的任何本地变量都会被推到堆叠上( 并在那里使用 ) 。 当子例程完成时, 所有的事物都会从堆栈中跳出来。 pc 和 注册数据会得到并放回原位, 所以您的 progra 就会被推到堆叠上( 并在那里使用 ) 。

它是一个特殊的数据结构,可以跟踪不同大小的记忆区块及其分布状况。

在“古典”系统上, 堆叠指针是放在记忆底部开始的, 堆积指针是从顶部开始的, 并且它们相互向上发展。 如果它们重叠, 你就会脱离公羊。 但是, 与现代多孔的套索不起作用。 每条线必须有自己的堆叠, 并且它们可以动态地生成 。

科学家在最初决定两个建筑(Von Neumann,这里所有东西都被视为数据,Harvard,那里保留了用于指示的记忆区和另一个数据区)之间。 最终,我们采用了von Neumann设计,现在一切都被认为是“相同的”。 当我在学习组装时,这让我很难接受 https://www.cs.virginia.edu/~evans/cs216/guides/x8。

上面所有内容都在谈论数据。我的猜测是,既然教学是一个定义的事物, 带有特定的记忆足迹, 它会进入堆叠, 所以所有在集合中讨论的“ 那些” 登记册都在堆叠中。 当然, 然后以对象为方向的编程, 将指示和数据混合到一个动态的结构中, 所以现在指示也会被保存在堆肥上?