gpt4 book ai didi

c++ - 堆和栈内存是如何管理、实现和分配的?

转载 作者:可可西里 更新时间:2023-11-01 15:20:48 28 4
gpt4 key购买 nike

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

每个是如何实现的?它是如何管理的(高层)? gcc 是否预先分配了一 block 内存用于堆栈和堆,然后根据请求分发?原始内存来自 RAM 吗?

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

澄清

我真的问的是堆和栈内存的实现和管理。 After reading referenced question,我没有找到解决该问题的任何内容...感谢您提供链接

最佳答案

现代操作系统不允许您直接访问硬件 RAM,而是将其抽象为所谓的虚拟内存,并按需将其映射到 RAM。每个进程通常都有自己的完整地址空间的私有(private)拷贝。这允许操作系统在运行时在 RAM 中移动进程的内存,甚至将其换出到磁盘。这是透明发生的,即进程不会收到此类重定位的通知,也不需要代码来处理它。 (一些实时应用程序可能会使用一些技术来防止其内存被换出)。

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

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

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

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

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

关于c++ - 堆和栈内存是如何管理、实现和分配的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1212797/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com