关于为什么栈比堆快的一个猜想
我很好奇栈LIFO的结构凭什么比随用随(两步)取的堆更快,尤其是访问非栈顶元素的时候,岂不是要弹出许多不相关的元素才能访问到目标元素吗?访问完了还要把弹出的元素再压栈回去?这样的思路似乎不会让栈很快。
在网上寻找答案找到的都是“栈不需要两步而直接访问所以更快、CPU有专门的硬件设计支持栈而堆靠的是操作系统软件支持所以栈更快”这样不具备说服力的答案。
猜想:栈中分配的空间都是编译的时候已经能够确定大小和访问次序的内容,于是在初始化程序的时候不仅可以预先分配好战中的空间,还可以安排好压栈、弹出的顺序,只要访问顺序确定,减少访问非栈顶元素次数是可以做到的,甚至可能是可以避免的,于是每次要访问的元素总是栈顶那一个,不必为了访问某个元素而弹出上边的多个其他元素,速度杠杠滴。
int a=0; int b=1; int c=2; print(a);//如果按a,b,c顺序压栈,那么就要弹出c,b才能访问a。如果a后便有更多元素,那么要弹出的就更多。那凭什么比堆内存更快? 如果编译器优化,转换为: int b=1; int c=2; int a=0; print(a);//此时栈顶就是a
猜想:使用的不是完全严格的栈,弹出是假弹出,类似于数组和数组下标的使用。