如何管理,实施和分配堆和堆栈内存?

在C / C ++中,我们可以将变量,函数,成员函数,类的实例存储在堆栈或堆中。

各自如何实施? 它如何管理(高级别)? gcc是否预先分配了一堆用于栈和堆的内存,然后根据请求进行分配? 原始内存来自RAM吗?

函数可以分配在堆而不是堆栈上吗?

澄清

我真的在询问关于堆栈和堆栈内存的实现和管理。 在阅读引用的问题后,我没有发现任何解决该问题的内容......感谢链接


现代操作系统不能直接访问硬件RAM,而是将其抽象为虚拟内存,然后根据需要映射到RAM。 每个进程通常都有自己的完整地址空间的私有副本。 这使操作系统能够在运行时将进程内存移动到内存中,甚至可以将其交换到磁盘。 这是透明地发生的,即一个进程没有被通知这样的重定位,并且不需要代码来处理这个。 (一些实时应用程序可能使用技术来防止将其内存换出)。

将目标文件链接到可执行文件或动态库时,链接程序为函数/方法的cpu指令和所有全局变量静态分配内存。 当操作系统加载可执行文件或动态库时,它会将此预分配内存映射到实际内存中。

启动时,每个线程都会收到一个称为堆栈的私有内存区域。 每次调用函数/方法时,编译器都会插入代码以自动分配(通过递增堆栈指针)足够的内存,以保存函数/方法使用的所有参数,本地变量和返回值(如果有)。 如果编译器确定在处理器寄存器中保留一些变量就足够了,它就不会在堆栈上为其分配内存。 当函数/方法返回时,它运行由编译器生成的代码以释放(通过递减堆栈指针)该内存。 请注意,堆栈中任何对象的析构函数将在退出时定义的块被调用,这可能需要很长时间才能返回。 而且,编译器可以自由地重用分配的内存,因为它认为合适。

当抛出一个异常时,编译器编译器会插入特殊的代码来知道堆栈的布局,并且可以展开它,直到找到合适的异常处理程序。

与此相反,堆中的内存使用new / delete进行分配,编译器通过插入代码来使用系统库请求或释放内存。

请注意,这是一个简单的描述,让您了解内存分配的工作原理。


基本上堆不是由编译器实现的,而是由C运行时库实现的。 显然这个代码是非常依赖于平台的。 在Unix或类Unix系统上,实现通常基于sbrk / brk系统调用,并分配更大量的内存以减少系统调用次数。 这个内存然后由堆内存管理器管理。 如果需要更多内存,则会发出一个新的sbrk调用。 如果您有兴趣调试堆管理例程,可以使用sbrk(0)获取堆的当前结束地址。 大多数内存管理器在进程的生命周期内不会将内存返回给操作系统(如果满足某些约束条件,gnu c运行时库会执行此操作)。

更详细的描述可以在http://gee.cs.oswego.edu/dl/html/malloc.html中找到。

链接地址: http://www.djcxy.com/p/13809.html

上一篇: How is heap and stack memories managed, implemented, allocated?

下一篇: c++: what's the difference between new Object() and Object()