据我所知,栈内存在虚拟内存地址中是连续的,但物理上的栈内存也是连续的吗?这是否与栈大小限制有关?
编辑:我曾经认为栈内存不必在物理上是连续的,但我们为什么认为栈内存总是比堆内存快呢?如果它在物理上不是连续的,那么栈如何更好地利用缓存?还有一件事情总是让我感到困惑,CPU在数据段中执行指令,而数据段在虚拟内存中并不靠近栈段,我不认为操作系统会使栈段和数据段在物理上靠得很近,因此这可能会损害缓存效果,你怎么看?
再次编辑:也许我应该举个例子来更好地表达自己,如果我们想要对大量数字进行排序,使用数组来存储数字比使用链表更好,因为每个链表节点都可能由malloc构造,所以它可能无法充分利用缓存,这就是我说栈内存比堆内存更快的原因。
编辑:我曾经认为栈内存不必在物理上是连续的,但我们为什么认为栈内存总是比堆内存快呢?如果它在物理上不是连续的,那么栈如何更好地利用缓存?还有一件事情总是让我感到困惑,CPU在数据段中执行指令,而数据段在虚拟内存中并不靠近栈段,我不认为操作系统会使栈段和数据段在物理上靠得很近,因此这可能会损害缓存效果,你怎么看?
再次编辑:也许我应该举个例子来更好地表达自己,如果我们想要对大量数字进行排序,使用数组来存储数字比使用链表更好,因为每个链表节点都可能由malloc构造,所以它可能无法充分利用缓存,这就是我说栈内存比堆内存更快的原因。
malloc
是调用需要记录内存区域并最终分配新页面的函数。这很费钱。简而言之,堆栈是一种更为限制性的数据结构。缓存与此关系不大,堆栈顶部几乎总是在缓存中非常热门,因为它被非常频繁地使用,但很容易构建一个将其从缓存中清除的函数。 - Margaret Bloom