C#中堆栈和堆是什么? 遍历又是什么,有什么用处。 C#堆和堆栈有什么区别

作者&投稿:营凭 (若有异议请与网页底部的电邮联系)
个人见解,供参考

数据结构方面的堆和栈,这里的堆实际上指的就是(满足堆性质的)优先队列的一种数据结构,第1个元素有最高的优先权;栈实际上就是满足后进先出的性质的数学或数据结构。

遍历就是按照一定的顺序,从头到尾将存储的数据(链表中、堆中、栈中)访问一遍。

遍历的用处简单的说就是通过遍历找到合适的结点或位置,从而执行访问、插入、修改或者删除等一系列操作。
堆、栈中的数据多数情况下是存储在结点(通过动态分配的内存空间)中,而不是存放在数组中,所以无法直接对某个结点及其中的数据进行访问和操作。堆栈中的不同数据结点通过指针互相联系,能够直接操作的一般只有头结点和尾结点。为了能够对整条数据链中满足特定条件的结点进行相应的操作,采用遍历的方式,从头结点开始,按照特定的顺序,依次访问堆、栈中的结点,从而找出符合条件的结点,并进行相关的处理!

栈用于存储值类型
堆栈存储引用类型,都是在内存中 栈是实际的内存大小 堆栈只是代表相应的栈的内存地址 所以值类型也可以说栈的存取速度要快

遍历就是循环 学过C的话就是for
C#里有foreach

层次遍历,是一种完全二叉树

请解释一下在c#中堆和栈,它们分别有哪些作用~

楼上的对“栈”的解释正确。

但对“堆”的解释有误,在.NET(C#)中堆是有垃圾收集器(GC)来维护的,不是由程序员直接控制的。

其实不必深究“栈”和“堆”的是什么,其本质都是一块内存,都是又来存储。
身故障导致系统无法运行。)。一般BIOS被病毒破坏

首先堆栈和堆(托管堆)都在进程的虚拟内存中。(在32位处理器上每个进程的虚拟内存为4GB)

堆栈stack

堆栈中存储值类型。

堆栈实际上是向下填充,即由高内存地址指向地内存地址填充。

堆栈的工作方式是先分配内存的变量后释放(先进后出原则)。

堆栈中的变量是从下向上释放,这样就保证了堆栈中先进后出的规则不与变量的生命周期起冲突!

堆栈的性能非常高,但是对于所有的变量来说还不太灵活,而且变量的生命周期必须嵌套。

通常我们希望使用一种方法分配内存来存储数据,并且方法退出后很长一段时间内数据仍然可以使用。此时就要用到堆(托管堆)!



堆(托管堆)heap

堆(托管堆)存储引用类型。

此堆非彼堆,.NET中的堆由垃圾收集器自动管理。

与堆栈不同,堆是从下往上分配,所以自由的空间都在已用空间的上面。

比如创建一个对象:

Customer cus;

cus = new Customer();

申明一个Customer的引用cus,在堆栈上给这个引用分配存储空间。这仅仅只是一个引用,不是实际的Customer对象!

cus占4个字节的空间,包含了存储Customer的引用地址。

接着分配堆上的内存以存储Customer对象的实例,假定Customer对象的实例是32字节,为了在堆上找到一个存储Customer对象的存储位置。

.NET运行库在堆中搜索第一个从未使用的,32字节的连续块存储Customer对象的实例!

然后把分配给Customer对象实例的地址赋给cus变量!



从这个例子中可以看出,建立对象引用的过程比建立值变量的过程复杂,且不能避免性能的降低!

实际上就是.NET运行库保存对的状态信息,在堆中添加新数据时,堆栈中的引用变量也要更新。性能上损失很多!

有种机制在分配变量内存的时候,不会受到堆栈的限制:把一个引用变量的值赋给一个相同类型的变量,那么这两个变量就引用同一个堆中的对象。

当一个应用变量出作用域时,它会从堆栈中删除。但引用对象的数据仍然保留在堆中,一直到程序结束 或者 该数据不被任何变量应用时,垃圾收集器会删除它。