堆栈和堆之外的任何内存使用范例?

smw*_*dia 5 c++ architecture operating-system

由于我已经学习了数据结构,我知道除了Stack和Heap之外还有很多其他的数据结构,为什么现在的进程只包含这两个范例作为其地址空间中的"标准设备"?是否有任何全新的内存使用范例?

谢谢你的回复.是的,我意识到我的陈述有问题.堆数据结构与进程的地址空间中的堆不同.但我想知道的是除了proecss地址空间中的堆栈区域和堆区域之外,还有什么新的范例可以使用内存吗?似乎其他内存使用方式建立在这两个基本范例之上.这两种范式是一些元范式吗?

S.L*_*ott 4

让我们想一下。我们有两个基本的存储规则。连续的和碎片的。

连续的。

  • 堆栈受顺序限制。后进先出。函数调用的嵌套上下文需要这样做。

  • 我们可以轻松地反转此模式来定义Queue。先入先出。

  • 我们可以向队列添加一个绑定来创建一个循环队列。输入输出处理需要这个。

  • 我们可以将这两个约束合并到Dequeue中。

  • 我们可以向队列添加键和排序来创建优先级队列。操作系统调度程序要求这样做。

    所以。这是受入场顺序限制的连续结构的一系列变化。这些有多种实现。

  • 您可以拥有不受条目顺序约束的连续存储:ArrayHash。数组是通过“位置”来索引的,哈希是通过Key的哈希函数来索引的。

碎片化:

  • 裸露的“堆”是没有任何关系的碎片存储。这是通常的方法。

  • 您可以使用句柄来进行堆存储以允许重新定位。旧的 Mac 操作系统曾经这样做过。

您可以拥有带有关系的碎片存储——列表和树等。

  • 链接列表。单链表和双链表是实现选择。

  • 二叉树有 0、1 或 2 个子节点。

  • 高阶树。 尝试之类的。

我们在做什么?十几个?

您还可以将其视为“集合”,无论存储如何,它都存在。在这种情况下,您可以混合存储规则(堆或数组)

Bags:无序的集合,允许重复。您可以拥有一个基于多种存储规则构建的包:LinkedBag、TreeBag、ArrayBag、HashBag。链接和树使用碎片存储,数组和散列使用连续存储。

集合:无重复的无序集合。没有索引。再次:LinkedSet、TreeSet、ArraySet、HashSet。

列表:有序集合。按位置索引。再次:LinkedList、TreeList、ArrayList、HashList。

映射:键值关联集合。按键索引。LinkedMap、TreeMap、ArrayMap、HashMap。