我是CS世界的新手。在阅读一些书籍时,我检查了内存的动态分配,在程序运行时动态分配内存,该内存称为堆。所以这意味着每当我想在 Linkedlist 中创建一个新节点时,它都会存储在堆上?或者它被存储在内存上并访问运行时?
我还检查了每当运行任何程序时,操作系统都会为相同的程序创建PCB,包括至少4以下部分:
- 堆段
- 堆栈段
- 数据细分受众群
- 代码段
堆段和堆栈段动态增长取决于代码(向上或向下取决于系统)。
所以我的基本问题是
我们可以在 Linkedlist 中添加的最大元素,直到系统内存耗尽或堆内存耗尽?
我读到它直到系统内存耗尽。但我想知道怎么做?
我读过的最好的解释:
摘自因为堆会变大,堆栈会变大,所以它们基本上是相互限制的。此外,由于这两种类型的段都是可写的,因此其中一个段越过边界并不总是违规的,因此可能会出现缓冲区或堆栈溢出。现在有机制可以阻止它们发生。
每个进程的堆(堆栈)都有一个设置的限制。此限制可以在运行时更改(使用 brk()/sbrk())。基本上,当进程需要更多的堆空间并且已经用完分配的空间时,标准库将向操作系统发出调用。操作系统将分配一个页面,该页面通常由用户库管理以供程序使用。即,如果程序需要 1 KiB,操作系统将额外提供 4 KiB,库将为程序提供 1 KiB,并在程序下次请求更多时剩余 3 KiB 以供使用。
此处。
如果动态分配内存,则从堆中获取内存。
从上面的语句中,您可以直接得出结论,如果动态分配列表的节点,则最大节点数受堆大小(即堆内存量)的限制。