日期:2014-05-18  浏览次数:20780 次

堆栈和内存分配及程序初始化过程中的关系???
程序运行时,内存到底是如何分配的?堆和栈到底有什么区别?感觉糊涂得很,希望多多指点.  
   
  1.程序运行时,内存到底是如何分配的?  
  2.活动记录里到底记了些什么东东?  
  3.程序指令放在什么地方,数据又放在什么地方?  
  4.堆和栈到底有什么区别? 
程序的初始化过程 如什么时候装载 静态对象 非静态对象
继承时等等类和对象的初始化过程 也可以说是顺序 及和内存分配的关系

那位高人清楚啊 或有这方面资料 麻烦说哈啊 甚是感激

------解决方案--------------------
堆和栈的区别是很基础的东西了,百度一下,满天都是。基本上可以区别为一个为无序乱放,一个为有序存放。
而.net程序运行时的内存分配是很复杂的,而且所分配的内存地址也不是真实内存地址(.net安全性决定,类似于JAVA)。
至于程序加载的时候,首先是加载常量存储区,然后是静态,最后才是动态的。
继承时,我记得并不是先开辟父类,而是将父类和子类作为一个统一的类进行开辟。
这块说起来相当复杂,而且实际应用中几乎不会牵涉,所以楼主不必太关心。
------解决方案--------------------
堆里面存放的是引用对象,应为这些对象的大小是不确定的。栈里面存放的是大小固定的值类型或者指针变量,指针变量指向堆里面的引用对象,这样栈的读写速度就比较高。
当程序运行时,CLR先扫描了一遍各个类型,确定给这些类型在堆中分配多少空间,接下来在堆中创建类型对象,里面存放了静态数据。然后在运行的时候创建实例对象,所有的对象都有一个类型对象指针,该指针指向该对象所对应的类型对象。
------解决方案--------------------
CLR Via C#(第二版) 中关于这些都说的非常详细
------解决方案--------------------
一段程序,运行启动后,会查看起类型,如果是引用类型,则将其加载到托管堆中,若是值类型,则将其加载到托管堆栈中,二者的区别是,值类型直接保存变量的值,而引用类型变量保存的是变量的地址,其值可以在变量对应的地址中找到。

.net是将程序加载为程序集和IL,再通过JIT将上面的东西编译为机器语言,这样机器才能识别。
数据放在内存中
------解决方案--------------------
1。程序运行时,内存是在堆中进行分配的。
2。活动记录里记录了形式参数,返回地址,老ebp值,局部变量
3。程序指令放在内存中的代码段,由cs + ip确定下一条要执行的指令。数据放在全局静态数据区,数据段,堆,或者栈中
4。堆是用来程序执行中分配内存的;栈分为普通程序栈和内核栈,用来保存活动记录的。