记录下面试 。
说说堆 与 栈 的区别 非常基础的数据结构知识!
在C++ 里 堆是放引用 类型的,
栈是放值类型的,自底向上,先入后出。就像在一个管子里放弹珠一样,取的时候总是会取最后放的。
而堆呢就是一颗树的数组对象 线性数据结构,大顶堆小顶堆,堆排序等。。。
而在C#里面呢 是有托管堆的,是.Net自己的,它有一套GC (garbage Collecter)机制,这个清理垃圾的人会 在 某一定的场合下堆满了,或者有人叫它去清理了。他就会取清理。有他自己的逻辑算法,每一次发生GC 都会很耗性能,游戏开发里可以用对象池技术来优化。
https://www.cnblogs.com/zhijianliutang/archive/2011/12/07/2278735.html GC原理,
算法图很详细。https://www.cnblogs.com/nele/p/5673215.html
一、Mark-Compact 标记压缩算法
然后堆 其实也可以理解是一个完全二叉树,子节点都不大于父节点 叫大顶堆(根节点是最大),小顶堆和它相反,子节点都比父节点大。
内存分配方面 堆是应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程。
堆是指程序运行时申请的动态内存
栈呢,也是系统自动回收的,在编译的时候可以指定需要大小。
它的赋值就是开辟一块内存空间,进行复制,而堆呢,就是指向。引用地址。二者都遵循先入后出原则
区别就是 C#里 堆 的话,程序员可以不自动进行分配释放,让GC自己去释放。
栈 是由操作系统自己释放。
队列 在数据存储方面和上面是相反的,队列是先入先出,就像去银行排队一样,是一种特殊的线性表。申请储存空间的时候,必须要有队头 和队尾两个指针。
在C#里
内存管理上 进程堆与进程栈, 下面称 为 堆 和栈。
栈是管值类型的,而堆是管引用类型的。
在赋值的时候要注意,除了特殊的应用类型 string 之外。对于引用类型的赋值,修改赋值对象,会让原来的也跟着一起改变.而值类型不会,因为引用类型就是赋址(动态分配),本质上修改的就是指向原来的对象,因此会改变。而值类型是赋值。重新开一块内存,把原存的东西复制给它(静态分配)。
类型是怎么来的呢。 是.Net使用通用系统CTS 来定义 可以在中间语言(IL)中使用的预定义数据类型,所有面向.Net的都会被编译为IL 。例如,在C#中声明一个int变量时,声明的实际上是CTS中System.Int32的一个实例。
例如,在C#中声明一个int变量时,声明的实际上是CTS中System.Int32的一个实例。这具有重要的意义:
- 确保IL上的强制类型安全;
- 实现了不同.NET语言的互操作性;
- 所有的数据类型都是对象。它们可以有方法,属性,
https://www.cnblogs.com/bakuhert/articles/5878086.html 这个介绍的非常详细。
引用类型有class string ,数组 interface delegate Object
而值类型就有很多了 struct bool double char int float shot long.....
而ref和out 是在方法传递参数的时候选用的。两个都是传址的,传址可以改变他原来的值。
ref有进有出,out只出不进。