博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图解.NET Stack和Heap的本质区别
阅读量:6982 次
发布时间:2019-06-27

本文共 876 字,大约阅读时间需要 2 分钟。

  现在越来越觉得对.NET基本概念的理解和掌握对于提升编程水平的重要性,先从.NET的 Stack(栈)和Heap(堆)说起,计算机的内存可以分为代码块内存,stack内存和heap内存。代码块内存是在加载程序时存放程序机器代码的地方。Stack一般存放函数内的局部变量。而heap存放全局变量和类对象实例等。若只是声明一个对象,则先在栈内存中为其分配地址空间,若再实例化它,则在堆内存中为其分配空间。

1 Stack VS Heap

  由于计算机的内存分配过程比较抽象,下面举一个简单的程序片段,来图解和谐步骤对Stack和Heap内存的影响:

   下面的StackvsHeap类有一个Person类和Fun1方法,当调用Fun1方法时,当执行第一行代码,即

int i=3;

  在.NET中,除了string、object、class、delegate和interface外,其他的类型为数值类型,一般(不是全部)存放在Stack内存中。此处int i=3是函数内的非静态变量,而数值型为非引用类型,即会在Stack内存中分配一个区域来存放该变量的名和值。

当执行第二句语句,即

int j=i;

  .NET也会在Stack内存中分配一个区域来存放该变量的名和值。而且地址块在i=3之上(LIFO)。

  当执行第三句,即

Person p = new Person();

时,我们可以分为两步来看:

  1)在Stack上分配一个Person类型的p引用变量(指向Heap上的地址);

  2) 在Heap上分配一个空间来存储Person类的实例数据;

  具体的过程如下图所示:

2 值类型和引用类型

 理解了上面的过程,现在理解值类型和引用类型的变量则更加容易:

 先看下面的图:

 

  由于int j=i中是int类型,为值类型变量,则j=3为i=3的拷贝,因此,修改i不会修改j,修改j也不会修改i;

  而Person p2=p中Person为类,是引用类型,因此p2和p指向同一个heap地址块,因此,修改p2的值会影响p的值。

 

转载地址:http://lmvpl.baihongyu.com/

你可能感兴趣的文章
numpy库中的extend()函数使用
查看>>
进制转换
查看>>
我的友情链接
查看>>
新书上市:《FLUENT 14.0超级学习手册》
查看>>
mysql数据库query cache
查看>>
使用docker commit 来扩展一个image
查看>>
jsp 防止sql注入 之 preparestatement篇(转载)
查看>>
Linux之Ansible入门用法(实验解析)
查看>>
Linux系统如何在开机时修改root密码
查看>>
共济失调对我们的危害你知道吗
查看>>
Anychat的绝对路径与相对路径
查看>>
我的友情链接
查看>>
如何使用网络库实现应用级消息收发
查看>>
Single Area OSPF
查看>>
rhel6之yum
查看>>
selenium+ant+testng测试框架简单介绍
查看>>
自己写的DBUtil数据库连接工具类
查看>>
登录多实例MySQL失败,修改密码临时解决,原因不明
查看>>
SCCM 2007 R2部署、操作详解系列之部署篇
查看>>
hystrix thread pool Metrics
查看>>