操作系统:Windows 7 32位
所以在c ++中,有一个堆和一个堆栈。但是我最近开始学习一些装配,并没有看到任何类型的东西,只有一堆,但它看起来像纯粹的记忆。 那么特定于c ++和其他语言的堆和堆栈实现呢?或者你仍然在汇编中分配堆和堆栈?在启动可执行文件时,windows在为进程分配内存方面做了什么? 一个过程如何知道堆栈大小需要多大?
什么事情
编辑:也许有人可以提供关于如何通过CPU / OS为进程处理堆和堆栈内存的链接
答案 0 :(得分:11)
我的大多数知识都不是特定于Windows的,所以请耐心等待:
堆和堆栈指的是内存中的不同区域(但我们仍在讨论每种情况下的主内存)。这对任何语言都不是特别的。堆存在于低内存地址中并且向上增长;堆栈存在于高内存地址中并向下扩展。这是为了防止它们重叠(这将非常糟糕)。
在32位架构上,EBP和ESP寄存器跟踪当前堆栈帧。 EBP是基指针 - 它指向当前堆栈帧的高地址。 ESP是堆栈指针,它指向当前堆栈帧的低地址。
请记住,自由/分配堆和堆栈内存的概念在应用程序级别主要相关。在机器级别,所有内存看起来都是一样的 - 由程序员(或编译器)来跟踪正在使用的内存段。
堆栈由以下组合管理:调用函数的指令,以及对EBP和ESP的显式修改。 ESP以下的任何东西都被认为是自由的;所以为了释放记忆,你可以加入ESP。
堆由内存分配方法管理;文档可以找到here。我不确定Winows的细节,但一般会有一些内存管理器负责确保没有内存块分配给多个应用程序。
答案 1 :(得分:9)
堆栈主要由CPU维护(PUSH / POP / CALL / RET命令);堆纯粹是一个OS /运行时库功能。因此,堆栈访问在组装中是自然的。对于堆访问,您只需从汇编代码(HeapAlloc / HeapFree或其他库)调用相关的API。与堆栈不同,汇编语言中没有用于堆内存管理的低级原语。
您不必担心Windows上的堆栈大小。当你越来越多地使用它时,它会变得透明。在低级方面,Windows在堆栈底部下方设置一个保护内存页面(假设堆栈增长)。当堆栈到达保护页面时,CPU中会生成访问冲突异常。 Windows内核会抓住它,注意情况并增加堆栈。