如何堆和栈内存管理,执行,分配呢?(How is heap and stack memories m

2019-06-17 20:52发布

在C / C ++,我们可以存储变量,函数,成员函数,一个类的实例或者在堆叠或堆。

各是如何实现的? 它是如何管理(高电平)? 确实GCC预先分配用于堆栈和堆存储器的块,然后多尔斯列于请求? 是原装内存RAM中来吗?

可以函数在堆中,而不是堆分配?

澄清

我真的问的堆和栈内存的实施和管理。 阅读参考的问题后,我没有找到任何解决了......感谢您的链接

Answer 1:

现代操作系统不给你的硬件RAM的直接访问,而是抽象它在所谓的虚拟内存,它映射到RAM的需求。 每个过程通常被赋予完整的地址空间自己的私人副本。 这允许操作系统在运行时在RAM中移动的过程的记忆,甚至将其交换到磁盘。 这都是透明的,即一个进程没有通知该项搬迁且不需要具有代码来处理这个问题。 (某些实时应用程序可能使用技术来防止有它的内存换出)。

当目标文件链接到可执行文件或动态库,链接器的静态函数/方法的CPU指令,为所有的全局变量分配内存。 当操作系统加载的可执行文件或动态库,它映射这个预分配内存到实际内存。

在启动时,每个线程接收叫做堆叠使用的私有内存区域。 每个调用一个功能/方法的时候,编译器插入代码来自动分配(通过递增堆栈指针)从堆栈足够的内存来存储所有参数,局部变量和返回值(如果有的话)的功能/方法使用。 如果编译器决定了它是足以在离开处理器寄存器一些变量,它不会在栈它分配内存。 当函数/方法返回,它运行由编译器生成的代码,以释放(通过递减堆栈指针)这个存储器。 请注意,当块他们退出定义堆栈上的任何对象的析构函数将被调用返回前,这可能是一个漫长的时间。 此外,编译器是免费的,因为它认为合适的重用alloacated内存。

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

与此相对,在堆上分配内存使用new / delete ,为此,编译器插入代码以请求或使用系统库释放内存。

请注意,这是一个简单的描述给你的内存分配是如何工作的想法。



Answer 2:

基本上堆不被编译器实现的,而是通过C运行时库。 显然,这代码是非常依赖于平台。 上类似Unix的Unix或制度的实施是一般根据SBRK / BRK系统调用的内存更大的量分配,以减少系统调用的次数。 该内存然后堆内存管理器管理。 如果需要更多的内存新呼叫SBRK被发出。 堆的电流结束地址可以SBRK(0)如果你有兴趣在调试堆管理程序来获得。 大多数的内存管理器的进程的生命周期内不返回的内存操作系统(如果某些约束条件都能满足GNU C运行时库一样)。

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



文章来源: How is heap and stack memories managed, implemented, allocated?