我们知道,当任何一个程序运行的时候都需要内存,用C语言举例,一个简单的程序:
#include <stdio.h>
int plus(int a,int b);
int main(){
int a=2;
int b=3;
int sum;
sum=plus(a,b);
printf("a+b=%d",sum);
};
int plus(int a,int b){
return a+b;
};
那么这段程序是如何在内存中分配的呢?
在JAVA 和C# 中,程序都是以堆栈的形式在内存中分配的,C语言里也是一样。然而,什么是堆,什么又是栈呢?我们只知道堆和栈都是内存中的一块区域,至于他们的分配,我认为用一张图表示更容易理解:
从下到上的地址是越来越大的,关于常量先不在这里做说明。这里先说一下栈,栈是内存中的一种“后进先出”的数据结构,用以上的例子来说,我的main函数执行后,先定义了三个变量a、b和sum,因为都是局部变量,所以并没有分配堆内存给他们。程序运行到这里,这三个变量入栈的顺序依次是a,b,sum,然后当main函数发现接下来调用了plus()之后,又将plus()入栈,当plus()的值返回给sum的时候,main函数发现plus()已经调用完了,由于栈内存实质上只是很小的一块内存空间,操作系统为了保证程序能完整的运行,必须确保栈里面的东西不会溢出,否则就蓝屏了……那么就必须对这一小块内存空间进行释放,这时候,栈里面还有a,b,sum和plus()。对操作系统而言,他只知道plus()已经调用完成了,并不知道三个变量后面是否需要,但是又要释放空间。换做是我们,也会先把用完的东西扔掉吧,同理,对栈来说,他也会先把plus()出栈。之后入栈的printf()也是如此,简单说就是用完就扔,再后来发现main函数结束了,操作系统才把内存全部释放。这就是“后进先出”。
堆,堆是比较像hash map的一种结构,用面向对象的思维理解的话,就是当我new了一个对象出来的时候,我就在堆内存中分配一个key给这个对象,当我需要调用这个对象的时候,系统会搜索对应的key找出这个对象,然后进行入栈,出栈的操作。在栈里对这个对象进行的操作和上文说的操作是一样的,调用完就扔。不过不会把这块内存释放掉,而是将入栈的指针指向其他的内存,因为这个对象所占据的内存,并不属于栈,而是在自己开辟的堆内存中。
原文:http://www.cnblogs.com/NF-jie/p/4915448.html