Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 堆和堆栈内存是如何管理、实现和分配的?_C++_Memory Management_Heap Memory_Stack Memory - Fatal编程技术网

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

C++ 堆和堆栈内存是如何管理、实现和分配的?,c++,memory-management,heap-memory,stack-memory,C++,Memory Management,Heap Memory,Stack Memory,在C/C++中,我们可以将变量、函数、成员函数、类实例存储在堆栈或堆上 如何实现每一个目标?它是如何管理的(高层)?gcc是否预先分配一块内存用于堆栈和堆,然后根据请求分配?原始内存来自RAM吗 可以在堆上而不是堆栈上分配函数吗 澄清 我真的在问堆和堆栈内存的实现和管理。我找不到任何关于。。。感谢链接,堆基本上不是由编译器实现的,而是由C运行时库实现的。显然,这段代码非常依赖于平台。在Unix或类似Unix的系统上,实现通常基于sbrk/brk系统调用,并分配更大的内存以减少系统调用的数量。然后

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

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

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

澄清
我真的在问堆和堆栈内存的实现和管理。我找不到任何关于。。。感谢链接,堆基本上不是由编译器实现的,而是由C运行时库实现的。显然,这段代码非常依赖于平台。在Unix或类似Unix的系统上,实现通常基于sbrk/brk系统调用,并分配更大的内存以减少系统调用的数量。然后,该内存由堆内存管理器管理。如果需要更多内存,则发出对sbrk的新调用。如果您对调试堆管理例程感兴趣,可以使用sbrk(0)获取堆的当前结束地址。大多数内存管理器在进程的生命周期内不向操作系统返回内存(如果满足某些约束,gnu c运行时库会这样做)


有关更详细的说明,请参见。

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

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

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

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

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


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

Dupe of of of of the许多其他方法。再想想,这是不同的,因为我真正想问的是堆和堆栈内存的实现和管理。在阅读了参考问题后,我没有发现任何能够解决。。。谢谢你的链接…@奥特曼:如果不同,请重写以强调不同之处。不要评论你的问题。这是你的。重写它以获得你真正想要的信息。我不太喜欢结束性问题,但这在我看来是一样的。重新措辞,让它足够不同,我可能会收回我的投票。@S.Lott我会重写这个主题,但我已经在问题中问了我想要什么。。确切地说:)情况并非总是如此。在功能足够强大的操作系统上,CRT不必这样做。与堆栈类似:如果操作系统有足够的能力,编译器就不必做那么多。操作系统可以处理堆栈,但不能处理堆的情况很常见,但不是通用的。我很确定MSVC可以将大部分内存返回给操作系统。