堆栈和堆内存的大小
可能重复:
什么和堆栈和堆在哪里?
关于ac程序中内存布局的基本概念,我了解到:
问题
“堆栈是在顶层地址和低层地址的堆中创建的”请详解这一点
这是一个神话。 它可能有历史真相的基础。 它有时可能与你在现实生活中看到的东西产生共鸣。 但这并不是真的。
但是,探索很容易:
#include <stdlib.h>
#include <stdio.h>
void check(int depth) {
char c;
char *ptr = malloc(1);
printf("stack at %p, heap at %pn", &c, ptr);
if (depth <= 0) return;
check(depth-1);
}
int main() {
check(10);
return 0;
}
在我的机器上,我看到:
stack at 0x22ac3b, heap at 0x20010240
stack at 0x22ac0b, heap at 0x200485b0
stack at 0x22abdb, heap at 0x200485c0
stack at 0x22abab, heap at 0x200485d0
stack at 0x22ab7b, heap at 0x200485e0
stack at 0x22ab4b, heap at 0x200485f0
stack at 0x22ab1b, heap at 0x20048600
stack at 0x22aaeb, heap at 0x20048610
stack at 0x22aabb, heap at 0x20048620
stack at 0x22aa8b, heap at 0x20048630
stack at 0x22aa5b, heap at 0x20048640
所以,堆栈正在向下,堆栈正在向上(正如你所期望的那样,基于神话),但是堆栈的地址较小,并且它们没有向对方扩展(神话故事)。
顺便说一下,我的check
函数是尾递归的,在一些编译器选项的实现上,你可能会看到堆栈根本不移动。 它告诉你一些关于为什么标准没有规定所有这些工作如何 - 如果它做到了,它可能会无意中禁止有用的优化。
如前所述,尺寸是特定于操作系统的。 例如在使用Visual Studio的窗口上,默认堆栈大小为1MB
MSDN
在Linux上,以下命令可以显示当前显示的内容。
ulimit -s or -a
在我的Linux mint 64位上显示8192 KB。
加载到内存中的每个程序都有多个段。 在汇编中,可以使用.data,.code等前缀(intelx86)指示每个文件。
它是有几个子部分的数据段。 除了其他几个之外,堆栈和堆都是其中的一部分。
堆栈也可以隐式增长,即当你进行另一个函数调用时,一个激活记录被推入堆栈,它们通过利用更多的堆栈内存。 这就是当程序用完分配堆栈时无限递归导致崩溃的原因。
当函数调用返回时,该激活记录被弹出并且堆栈缩小。
相反,堆从相反的方向增长并包含所有动态分配的内存。
这两个细分市场朝相反方向发展的原因是为了最大限度地利用其联合记忆。 请注意,正如评论中所述,这不是交流标准,但最常见的操作系统已经实现了这一点。
------堆栈开始-----------堆栈向下增长
--------除非他们互相交叉,否则程序可以运行。
-------堆开始------------堆向上生长
如果你的程序不使用堆,你的堆栈可以利用最大的内存,包括堆的数量。 如果程序几乎不进行递归调用并使用最小局部变量(即使用较少内存的堆栈),则它可以充分利用堆。
数据段的其他部分是BSS等,其中可能包含未初始化的静态变量等字段
什么是堆栈/堆创建的初始大小? 谁来决定呢?
这是编译器和操作系统特定的。
其中物理记忆是他们创造的? 我看到一个一般的描述:“堆在顶层地址中创建,堆栈在低层地址中”。
这是编译器和操作系统特定的。
真。 语言标准没有规定最小堆栈大小,也没有指定堆栈或堆内存中的位置。 其原因是为了使C程序更少依赖这些细节,因此可以更方便地移植到不同的平台(阅读:不同的操作系统,不同的CPU,不同的编译器)。
链接地址: http://www.djcxy.com/p/257.html上一篇: Size of stack and heap memory
下一篇: Java heap & stack