首页 > 其他 > 详细

关于内存结构的分配

时间:2015-10-27 21:39:40      阅读:243      评论:0      收藏:0      [点我收藏+]

 

我们知道,当任何一个程序运行的时候都需要内存,用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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!