面向对象(三)-内存分析:堆与栈

1.内存

我们把内存分为堆空间和栈空间

栈空间比较小,但是读取速度快
堆空间比较大,但是读取速度慢

2.栈(stack)

内存中存储的是可变长度的数据区域,栈是自上向下进行填充,即由高内存地址指向低内存地址并且内存分配是连续的,C#中所有的值类型和引用类型的引用都分配在栈上,栈根据后进先出的原则,依次对分配和释放内存对象。

  • 栈的特征:
    数据只能从栈的顶端插入和删除
    把数据放入栈顶称为入栈(push)
    从栈顶删除数据称为出栈(pop)


    面向对象(三)-内存分析:堆与栈_第1张图片
3.堆(heap)

内存中存储的是固定长度的数据区域。堆是从下往上分配,所以已用的空间在自由空间下面,C#中所有引用类型的对象分配在托管堆上,托管堆在内存上是连续分配的,并且内存对象的释放受垃圾收集机制的管理,效率相对于栈来说要低的多。

  • 堆的特征:
    堆是一块内存区域,与栈不同,堆里的内存能够以任意顺序存入和移除


    面向对象(三)-内存分析:堆与栈_第2张图片
4.GC Garbage Collector垃圾回收器

CLR的GC就是内存管理机制,我们写程序不需要关心内存的使用,因为这些都是CLR帮我们做了。


面向对象(三)-内存分析:堆与栈_第3张图片
GC
public class People
{
   int age;
   int height; 
}

static void Main(string[] args)
{
  People p ;  // 在栈中存储一个变量p,存储地址
  p = new People();  // new 关键字就是向系统要空间,根据后面的People来要要空间。存了两个int类型,所以是8个字节,但是C#针对类会分配8字节进行管理,所以总共开辟了16字节的空间
} 

你可能感兴趣的:(面向对象(三)-内存分析:堆与栈)