堆栈队列 值类型引用类型ref out C#

记录下面试 。

说说堆  与 栈 的区别 非常基础的数据结构知识!

在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 标记压缩算法

alt

然后堆 其实也可以理解是一个完全二叉树,子节点都不大于父节点 叫大顶堆(根节点是最大),小顶堆和它相反,子节点都比父节点大。

内存分配方面  堆是应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程。

堆是指程序运行时申请的动态内存

栈呢,也是系统自动回收的,在编译的时候可以指定需要大小。

它的赋值就是开辟一块内存空间,进行复制,而堆呢,就是指向。引用地址。二者都遵循先入后出原则

区别就是 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只出不进。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值