堆&栈

堆栈是一个在计算机科学中经常使用的抽象数据类型。堆栈在不同的领域有不同的概念,但也有一定的相通性。栈使用的是一级缓存,他们通常都是被调用时处于存储空间中,调用完毕立即释放。堆则是存放在耳机缓存中,声明周期由虚拟机的垃圾回收算法来决定,所以调用这些对象的速度相对栈来说,要慢一些。
形象来说,栈就是一条流水线,而流水线中加工的就是方法的主要程序,在分配栈时,由于程序是自上而下顺序执行,就将程序指令一条一条压入栈中,就像流水线一样。而堆上站着的就是工作人员,他们加工流水线中的商品,由程序员分配:何时加工,如何加工。而我们通常使用new运算符为对象在堆上分配内存(C#,Java),堆上寻找对象的任务交给句柄,而栈中由栈指针管理。

数据结构中的栈

栈:是限定仅在表尾(栈顶top)进行插入或删除操作的线性表。因此栈又称为后进先出(last in first out)的线性表。与线性表类似,栈也有两种存储表示方法:顺序栈、栈的链式表示。栈还有一个重要应用是在程序设计语言中实现递归,即一个直接调用自己活通过一系列的调用语句间接地调用自己的函数,称为递归函数。
队列:和栈相反,是一种先进先出(first in first out)的线性表。

操作系统的堆栈

栈:由操作系统自动分配释放,存放函数的参数值、局部变量的值等。操作方式类似于数据结构中的栈。
堆:一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式类似于链表。

C/C++中的堆栈

一个由c/c++编译的程序占用的内存分为以下几个部分

  1. 栈区:由编译器自动分配释放,存放函数的参数名,局部变量名等。其操作方式类似于数据结构中的栈。栈是有最大空间的,超出和报异常提示栈溢出。速度快,但无法控制。
  2. 堆区:由程序员分配释放,若程序员不释放,程序结构时可能由OS回收。它与数据结构中的堆是两回事,分配方式类似于链表。速度慢,但用起来方便(在c中使用malloc获取,在c++中使用new运算符获取)
  3. 静态区:全局变量和局部静态变量的存储放在一块的。程序结束后由系统释放。
  4. 文字常量区:常量字符串放在这里,程序结束后由系统释放。
  5. 程序代码区:存放函数体的二进制代码。

JAVA中的堆栈

栈:除string外的基本数据类型变量都会保存在栈中
堆:使用new来新建对象的,都会在堆中创建。
与C++不同,Java自动管理栈和堆,程序员不能直接设置。栈比堆的存取速度快,仅次于直接位于CPU的寄存器。但栈的数据大小与生存期必须是确定的,缺乏灵活性。栈内部多个值相等的变量是可以指向一个地址的。堆则可以动态分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。
Java中的数据类型分为基本类型和包装类数据。假设编译器处理int a=3;首先,在栈中创建一个变量为a的内存空间,然后查找字面值为3的地址,没有则开辟存放3这个字面值的地址。如果下次给啊赋值4,它又会再去找指向4的地址。这是字面值的引用,而不是类对象的引用。