可能重复:
什么和在哪里堆栈和堆?
关于在交流程序内存布局的基本概念,我的理解是:
- 语言使用两个主要的数据结构栈和堆 。
- 堆栈中创建并存储在本地变量和子程序的记账数据
- 堆创建存储程序的动态分配的变量
- 堆在本质上是可变长度的。(不是很确定在堆栈上)
- 一般而言,这是编译器/语言的请求OS执行之前创建这些数据结构的责任。
问题
- 什么是与创建堆栈/堆初始大小? 谁决定的呢?
- 其中物理内存中创建它们? 我看到的一般描述为“堆栈中的顶级地址,并在低级别地址堆上创建”请elobarate这
可能重复:
什么和在哪里堆栈和堆?
关于在交流程序内存布局的基本概念,我的理解是:
“堆栈中的顶级地址,并在低级别地址堆上创建”请elobarate这
这是一个神话。 它可能在历史真相的基础。 它有时可能与你的东西在现实生活中看到的共鸣。 但它不是完全正确的。
这是很容易去探索,但:
#include <stdlib.h>
#include <stdio.h>
void check(int depth) {
char c;
char *ptr = malloc(1);
printf("stack at %p, heap at %p\n", &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
功能是尾递归,并在一些实现一些编译器选项,你可能会看到堆栈不动的。 它告诉你一些关于为什么标准不强制要求这一切是如何工作的 - 如果它这样做是可能会无意中禁止有用的优化。
如前所述,尺寸OS具体。 例如,对于使用Visual Studio的窗口,默认堆栈大小为1MB
MSDN
在Linux下面的命令可以显示显示您当前的一个。
ulimit -s or -a
在我的Linux Mint的64位这表明8192 KB。
加载到内存中时,每个程序都有若干段。 在组装一个可使用。数据表示每个那些,.CODE等前缀(intelx86)。
这其中有几个子段的数据段。 堆栈和堆是除了几个人的一部分。
协议栈还可以利用堆栈的更多的内存增长隐含即当您再次函数调用,一个活动记录被压入堆栈,它们。 这就是为什么在碰撞无限递归结果在程序用完分配的堆栈。
当函数调用返回时,该活动记录被弹出和堆栈收缩。
相反堆从相反的方向生长,并包含所有动态分配的内存。
这两个节段生长在相反的方向上的原因是为了最大限度地发挥其合并存储器的利用率。 需要注意的是在评论中提到,这不是AC标准,但最常见的操作系统的这个实施。
------栈开始-----------栈向下生长
--------除非他们彼此交叉的程序是正常运行。
-------堆开始------------堆向上增长
如果你的程序不使用堆,你的筹码可以使用的最大内存包括堆了。 如果程序使一些递归调用,并使用最小局部变量(即用来堆栈内存少),它可以利用堆到最。
数据段的其他部分BSS等,其中可能包含的字段,如初始化静态变量
什么是与创建堆栈/堆初始大小? 谁决定的呢?
这是反编译和具体的操作系统。
其中物理内存中创建它们? 我看到的“堆在顶层地址和堆在低级别的地址创建”的一般描述。
这是反编译和具体的操作系统。
真。 语言标准不要求最小堆栈大小也不指定任一堆栈或在存储器堆中的位置。 而之所以说是让C程序更少地依赖于这些细节,因此更容易移植到不同的平台(即:不同的操作系统,不同的CPU,不同的编译器)。
首先,C标准没有对如何栈/堆由平台实现的任何要求。
What is the initial size with which a stack/heap is created? and who decides it?
典型地堆叠的固定尺寸被分配用于由OS每一个过程是平台特定的。 有一个关于堆的大小没有限制,程序通常都可用的虚拟地址空间。
Wherein physical memory are they are created?
这是特定平台。 典型地,堆栈向下增长和堆向上增长。