在 C/C++ 中,我们可以在堆栈或堆上存储变量、函数、成员函数、类的实例。
每一项是如何实施的?它是如何管理的(高层)? gcc 是否预先分配一块内存用于堆栈和堆,然后根据请求分配出去?原始内存是来自RAM吗?
函数可以分配在堆上而不是堆栈上吗?
澄清
我真正想问的是堆和堆栈内存的实现和管理。阅读参考问题后, https://stackoverflow.com/questions/408670/stack-static-and-heap-in-c我没有找到任何可以解决这个问题的内容...感谢您的链接
现代操作系统不允许您直接访问硬件 RAM,而是将其抽象为所谓的虚拟内存,并根据需要将其映射到 RAM。每个进程通常都有自己的完整地址空间的私有副本。这允许操作系统在运行时在 RAM 中移动进程的内存,甚至将其交换到磁盘。这是透明地发生的,即进程不会被通知这样的重定位,并且不需要有代码来处理这个问题。 (某些实时应用程序可能会使用技术来防止其内存被换出)。
将目标文件链接到可执行文件或动态库时,链接器会为函数/方法的 CPU 指令以及所有全局变量静态分配内存。当操作系统加载可执行文件或动态库时,它将预先分配的内存映射到实际内存中。
启动时,每个线程都会接收一个称为堆栈的私有内存区域。每次调用函数/方法时,编译器都会插入代码以自动从堆栈中分配(通过递增堆栈指针)足够的内存来保存函数/方法使用的所有参数、局部变量和返回值(如果有)。如果编译器确定将某些变量保留在处理器寄存器中就足够了,则它不会在堆栈上为其分配内存。当函数/方法返回时,它运行编译器生成的代码以释放(通过递减堆栈指针)该内存。请注意,堆栈上任何对象的析构函数都会在定义它们的块退出时被调用,这可能需要很长时间才能返回。此外,编译器可以自由地重用它认为合适的分配的内存。
当抛出异常时,编译器会插入特殊的代码,该代码知道堆栈的布局并可以展开它,直到找到合适的异常处理程序。
与此相反,堆上的内存是使用分配的new
/ delete
,编译器为此插入代码以使用系统库请求或释放内存。
请注意,这是一个简化的描述,旨在让您了解内存分配的工作原理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)