首先,我希望能提供更详细的书籍或资源,以更好地理解这个结构。我不明白这些是否是OS书籍、编程语言或架构书籍中通常解释的概念。
在我提出问题之前,我将根据有关堆栈/堆的阅读结果列出我的发现。
堆:
- 包含所有实例变量、动态分配(new/malloc)和全局变量。 - 不再使用堆数据结构,而使用更复杂的结构。 - 通过内存位置访问,各个进程负责其分配的内存。 - 碎片整理和分配由操作系统执行(请回答谁管理堆,操作系统还是运行时环境)。 - 在进程中共享,可以被拥有其引用的所有线程访问。
栈:
- 仅包含所有局部变量(在函数调用时推入)。 - 使用实际的堆栈数据结构进行操作。 - 由于连续性更快访问。
现在,以下是一些关于此主题的问题。
- 全局变量是在哪里分配的?我认为它们分配在堆上。如果是这样,那么它们是在运行时还是编译时分配的?另外一个问题是,这块内存是否可以被清除(使用delete)?
- 堆的结构是什么样的?堆是如何组织的(由操作系统管理还是由C/C++编译器设置的运行时环境管理)?
- 栈只保存方法及其本地变量吗?
- 每个应用程序(进程)都拥有单独的堆,但如果超过堆分配限制,这意味着操作系统无法分配更多内存吗?(我假设缺乏内存会导致操作系统重新分配来避免碎片化)
- 堆可以从进程内所有线程中访问(我认为是这样的)。是的,所有线程都可以访问实例变量、动态分配的变量和全局变量(如果它们引用它)。
- 不同的进程无法访问彼此的堆(即使传递了地址)。
- 栈溢出会崩溃
- 仅当前线程
- 当前进程
- 所有进程
- 在C/C++中,块变量是否在函数运行时在堆栈上分配内存(例如,如果代码的子块(例如For循环)创建一个新变量,那么它是在运行时在堆栈上分配的还是预先分配的?) 什么时候删除它们(块级作用域,如何维护)?我认为所有对堆栈的添加都是在块开始之前在运行时进行的,当达到该块的结束点时,所有添加到那一点的元素都被弹出。
- CPU对栈寄存器的支持仅限于可以通过正常访问内存递增(pop)和递减(push)的堆栈指针。这是真的吗?
- 最后,堆栈结构由OS/Runtime环境生成,存在于主存储器中(作为抽象)吗?