Heap and Stack
Stack栈 是用来静态分配内存的。
Heap堆是动态分配内存的。都是计算机内存中。
栈的分配是在程序编译的时候完成的,直接存在内存中,接触内存很快。栈是后进先出的顺序,最后被申请的快是最先被释放,这样很容易跟踪到栈,释放栈的过程简单到仅仅是移动下指针就能完成。
堆的分配是在程序运行时完成,分配速度较为缓慢,但是堆的可用空间非常多大。堆中的元素相互之间没有关联,各自都可以被任何时候随机访问。我们可以任何时候申请和是否一块内存,这样会使得我们很难随时随地跟踪到堆中的某个位置被分配了还是被释放了。
程序运行的场所是内存,堆和栈是进程的虚拟内存中的两个部分区域。
当程序被执行时,程序代码,创建的变量,常量都会被压入栈空间里,栈是程序的执行区域。栈的内存地址是连续的且被一一记录,比如int var =1 ,可以通过var这个变量来访问变量的内容。这里的var 存放在栈,地址已经被编译器计算和了。更直观的感受是数组,数组的元素在栈里是连续排放的,相邻的两个元素地址相差1.
而堆是不同于栈的另一部分区域。系统会给每个程序分配一个部分。
堆不属于程序,是独立的,公用的。
有栈,为什么要用堆?
栈里面的东西是有生命周期的,变量作用域。
而堆里面的东西是独立于程序,会一直存在。
每一个线程有一个私有资源就是栈,函数调用的时候,把返回地址和参数入栈,被调函数执行时把参数取出来,赋予形参。被调函数执行完之后要把返回地址取出来。栈是自动实现的,不需要程序员干预。