gpt4 book ai didi

c++ - 堆栈内存与堆内存

转载 作者:IT老高 更新时间:2023-10-28 12:00:21 26 4
gpt4 key购买 nike

Possible Duplicate:
What and where are the stack and heap

我正在使用 C++ 编程,我一直想知道堆栈内存与堆内存到底是什么。我所知道的是,当我调用 new 时,我会从堆中获取内存。如果如果创建局部变量,我会从堆栈中获取内存。在互联网上进行了一些研究后,最常见的答案是堆栈内存是临时的,而堆内存是永久的。

堆栈和堆内存模型是操作系统还是计算机体系结构的概念?那么其中一些可能不遵循堆栈和堆内存模型,或者它们都遵循它?

堆栈和堆内存是对虚拟内存的内存模型的抽象(可能在磁盘和 RAM 之间交换内存)。那么堆栈和堆内存在物理上可能是 RAM 还是磁盘?那么堆分配似乎比堆栈分配慢的原因是什么?

另外,主程序是在栈还是堆中运行?

另外,如果进程用完分配的堆栈内存或堆内存会怎样?

谢谢

最佳答案

在 C++ 中,堆栈内存是存储/构造局部变量的地方。堆栈还用于保存传递给函数的参数。

堆栈与 std::stack 类非常相似:您将参数压入它,然后调用一个函数。然后该函数知道它期望的参数可以在堆栈的末尾找到。同样,该函数可以将局部变量压入堆栈并在从函数返回之前将它们从堆栈中弹出。 (警告 - 编译器优化和调用约定都意味着事情并非如此简单)

堆栈确实最好从底层理解,我建议Art of Assembly - Passing Parameters on the Stack .很少,如果有的话,您会考虑使用 C++ 进行任何类型的手动堆栈操作。

一般来说,堆栈是首选,因为它通常位于 CPU 缓存中,因此涉及存储在其上的对象的操作往往更快。然而,堆栈是一种有限的资源,不应该用于任何大的东西。堆栈内存耗尽称为 Stack buffer overflow .这是一件很严肃的事情,但除非你有一个疯狂的递归函数或类似的东西,否则你真的不应该遇到它。

堆内存就像 rskar 所说的那样。通常,使用 new 分配的 C++ 对象或使用 malloc 之类分配的内存块最终会在堆上。堆内存几乎总是必须手动释放,尽管您应该真正使用智能指针类或类似的类以避免需要记住这样做。堆内存不足可能(会?)导致 std::bad_alloc。

关于c++ - 堆栈内存与堆内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5836309/

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