~~~~~~什么是●堆、栈和堆栈●。俺很笨的。~~~~~~
搜索出来很多答案。。
都是些什么C/C++什么的。。
有点晕。。
到底在C#中。。
上面三个是什么概念?。。
有人说栈和堆栈是一回事情,就是翻译不同。。
又出来个托管堆。。是什么?。。
晕了晕了。。彻底晕了。。
T_T
希望真正透彻的人用例子讲一下。。
不要又粘贴N长的文章。。
谢谢。。
------解决方案--------------------堆实际上指的就是(满足堆性质的)优先队列的一种数据结构,第1个元素有最高的优先权;栈实际上就是满足先进后出的性质的数学或数据结构。
------解决方案--------------------堆栈就是栈
堆是全局的内存空间,在堆里面分配对象都需要程序员来销毁,它不会自动销毁,
托管堆就是有CLR来帮你销毁对象,不需要像c++里面来delete
用new生成的对象就是在堆中分配的
栈分配的内存会自动释放,临时变量,临时对象,一般来说没有用new分配的对象都在栈中
------解决方案--------------------兄弟我也看书得来的,呵呵, 不对,还要请你不要发怒
------解决方案--------------------程序=算法+数据结构,
堆、栈和堆栈指是数据结构中的概念
------解决方案--------------------http://agassi001.cnblogs.com/archive/2006/05/10/396574.html
.net 中的堆栈..
------解决方案--------------------栈存放值类型,存放小容量数据,寻址快
堆存放引用类型,存大容量对象
真要搞懂买本书来看吧,推荐《C#2005从入门到精通》
------解决方案--------------------记不得从哪儿看到的话:栈里存值,堆里存引用
一下子就分清了
------解决方案--------------------这些基础的东西还是自己先看看书比较好.
另外,操作系统内存的 "堆栈 "和数据结构的 "堆栈 "是两回事.
------解决方案--------------------就我目前的知识,说一下(不知道是对是错,楼下的帮看看)
当一个应用程序启动时(这里假定为某个.exe程序),系统会分配一块内存空间给它,并另外再分配一个谓之“栈”的空间,应用程序在需要时,会在这个“栈”里面分配空间,比如看到 int x = 5;时,就在这个“栈”里面分配一个int数据的空间(注意,“栈”在启动.exe程序时,其在内存中的位置和大小就分配好了,如果不够用我不知道怎么办),非引用类型都是这样分配空间的,即不是用new来分配的东东,都在这个“栈”里这么分配了;
与之相对应的就是“堆”了(可能也叫堆栈,不确定,水平有限),那么什么是“堆”呢?
“堆”,就是内存空间,就是那些不属于任何.exe程序启动时被分配的空间(包括程序空间和“栈”的空间),换句话说,比如你有256MB内存,启动一个.exe程序,就会分配一定的空间(包括程序空间和一个“栈”),假设是10MB,那么还有246MB,这些就都是“堆”了,你在应用程序中new一个实例,就是在这246MB里,分配一定的空间给这个应用程序用了。(这里是打个比方,你要分配> 256MB的空间也行,操作系统会通过虚拟内存技术来满足你的需求)
总结一下,“栈”和“堆”都是内存空间
“栈”随应用程序启动而分配,其在内存中的位置和大小,一开始就分配好了;
“堆”不随应用程序启动而分配,你需要(new类实例)时才分配,其在内存中的位置是不确定的,大小就是类的大小了;
再多说一下,比如有一个Test类,程序中代码如下:
Test MyTest = new Test();
MyTest实例在“堆”中分配好空间,其在内存中的首地址,返回给程序使用,这是一个4个字节数值,它被赋给MyTest这个“变量”,MyTest这个“变量”就是一个引用,它的长度为4个字节,正好装下返回的地址值,那么,既然MyTest这个“变量”本身也是有大小的(4字节),那么它是在哪里分配的呢?答案是“栈”,MyTest这个“变量”是在“栈”中。
也就是说,“栈”中分配一个4字节的空间,这个空间里记录一个4字节长度的数值,这个数值是一个内存地址,指向“堆”空间(内存)中的一个单元,以此单元为首地址,这里记录着一个类实例。
不知道楼主明白了没有,希望不会被我越说越糊涂(也希望我说的是正确的)
------解决方案--------------------在cil里,简单点讲,堆主要是为了你的对象之类分配内存的,栈主要是为了方法的调用和退出(参数的压栈和出栈)服务的。
因此,其特点也不一样。