由于我已经学习了数据结构,我知道除了Stack和Heap之外还有很多其他的数据结构,为什么现在的流程只包含这两个范例作为其地址空间中的“标准设备”?是否有任何全新的内存使用范例?
感谢您的回复。是的,我意识到我的陈述有问题。堆数据结构与进程的地址空间中的堆不同。但我想知道的是除了proecss地址空间中的堆栈区域和堆区域之外,还有什么新的范例可以使用内存吗?似乎其他内存使用方式建立在这两个基本范例之上。这两种范式是一些元范式吗?
答案 0 :(得分:4)
让我们想一下。我们有两个基本的存储规则。连续和碎片。
连续的。
堆叠受订单限制。后进先出。函数调用的嵌套上下文需要这个。
我们可以轻松地反转此模式以定义队列。先进先出。
我们可以在队列中添加一个绑定来创建循环队列。输入输出处理需要这个。
我们可以将两个约束组合成 Dequeue 。
我们可以为队列添加密钥和排序,以创建优先级队列。 OS Scheduler要求这样做。
因此。这是由入口顺序约束的连续结构的一系列变体。并且有多种实现方式。
您可以按条目顺序排列连续存储:数组和哈希。数组由“position”索引,哈希由Key的哈希函数索引。
碎片化:
裸“堆”是没有关系的碎片存储。这是通常的做法。
您可以使用句柄进行堆存储以允许重定位。旧的Mac OS曾经这样做过。
您可以使用关系存储碎片存储 - 列表和树等。
关联列表。单链接和双链接列表是实现选择。
二叉树有0个,1个或2个孩子。
高阶树。 尝试等。
我们在做什么?十几个?
您也可以将其视为“集合”,无论存储如何都存在。在这种情况下,您混合存储规则(heapish或array-ish)
包:允许重复的无序集合。你可以拥有一个基于许多存储领域的包:LinkedBag,TreeBag,ArrayBag,HashBag。链接和树使用碎片存储,数组和散列使用连续存储。
设置:没有重复的无序集合。没有索引。再次:LinkedSet,TreeSet,ArraySet,HashSet。
列表:有序集合。按位置索引。再次:LinkedList,TreeList,ArrayList,HashList。
映射:键值关联集合。按键索引。 LinkedMap,TreeMap,ArrayMap,HashMap。
答案 1 :(得分:3)
请注意,“堆”(您可以按随机顺序分配和释放内存的内存区域)与名为“heap”(优先级列表)的数据结构无关。
顺便说一句,是的,除了Stack和Heap之外还有第三种内存使用范例:静态存储; - )
答案 2 :(得分:2)
首先想到FIFO。处理器之间共享内存。消息传递是一种记忆范式吗?
答案 3 :(得分:2)
Javolution(http://javolution.org/)有一些有趣的分配范例,通过使用上下文的代码和解释器“提示”来实现。汇集内存,对象回收支持等。虽然这是Java而不是C ++,但它仍然可用于研究概念。
答案 4 :(得分:1)
内存映射文件?
答案 5 :(得分:1)
“堆”根本不是一个范例,它是你能得到的最基本的东西:记忆就是你的,你可以随心所欲地使用它。 (“你”这里指的是操作系统/内核)。
如果你想一想,即使筹码也不是那么特别;你只是从堆的一端开始,并根据需要增长/缩小。
答案 6 :(得分:1)
我认为这与记忆的物理性质有关。堆和堆栈只是表达它的直观方式。
例如,队列或列表在概念上不适合随机访问。树不代表内存的物理性质(一个接一个的单元格,就像一个数组)。与简单的整数地址相比,任何具有x,y地址的元组都是不必要的复杂。
答案 7 :(得分:0)