C#中的堆栈与堆(托管堆) [转自互联网]

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

堆栈中存储值类型。
   堆栈实际上是向下填充,即由高内存地址指向地内存地址填充。
   堆栈的工作方式是先分配内存的变量后释放(先进后出原则)。
   堆栈中的变量是从下向上释放,这样就保证了堆栈中先进后出的规则不与变量的生命周期起冲突!
   堆栈的性能非常高,但是对于所有的变量来说还不太灵活,而且变量的生命周期必须嵌套。

通常我们希望使用一种方法分配内存来存储数据,并且方法退出后很长一段时间内数据仍然可以使用。

此时就要用到堆(托管堆):
   堆(托管堆)存储引用类型。

   堆(托管堆)在.NET中的堆由垃圾收集器自动管理。

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

比如创建一个对象:
   Customer cus= new Customer();
   申明一个Customer的引用cus,在堆栈上给这个引用分配存储空间。这仅仅只是一个引用,

不是实际的Customer对象!cus占4个字节的空间, 包含了存储Customer的引用地址。接着分配堆上的内存以

存储Customer对象的实例,假定Customer 对象的实例是32字节,为了在堆上找到一个存储Customer对象的

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

给Customer对象实例的地址赋给cus变量!

从这个例子中可以看出,建立对象引用的过程比建立值变量的过程复杂,且不能避免性能的降低!
实际上就是.NET运行库保存对的状态信息,在堆中添加新数据时,堆栈中的引用变量也要更新。性能上损失很多!
有种机制在分配变量内存的时候,不会受到堆栈的限制:把一个引用变量的值赋给一个相同类型的变量,

那么这两个变量就引用同一个堆中的对象。当一个应用变量出作用域时,它会从堆栈中删除。

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

时间: 2024-10-10 04:35:34

C#中的堆栈与堆(托管堆) [转自互联网]的相关文章

堆栈和托管堆 c#

堆栈和托管堆 c# 首先堆栈和堆(托管堆)都在进程的虚拟内存中.(在32位处理器上每个进程的虚拟内存为4GB) 堆栈stack 堆栈中存储值类型. 堆栈实际上是向下填充,即由高内存地址指向低内存地址填充. 堆栈的工作方式是先分配内存的变量后释放(先进后出原则). 堆栈中的变量是从下向上释放,这样就保证了堆栈中先进后出的规则不与变量的生命周期起冲突! 堆栈的性能非常高,但是对于所有的变量来说还不太灵活,而且变量的生命周期必须嵌套. 通常我们希望使用一种方法分配内存来存储数据,并且方法退出后很长一段

C#堆栈和托管堆

首先堆栈和堆(托管堆)都在进程的虚拟内存中.(在32位处理器上每个进程的虚拟内存为4GB) 堆栈stack 堆栈中存储值类型. 堆栈实际上是向下填充,即由高内存地址指向低内存地址填充. 堆栈的工作方式是先分配内存的变量后释放(先进后出原则). 堆栈中的变量是从下向上释放,这样就保证了堆栈中先进后出的规则不与变量的生命周期起冲突! 堆栈的性能非常高,但是对于所有的变量来说还不太灵活,而且变量的生命周期必须嵌套. 通常我们希望使用一种方法分配内存来存储数据,并且方法退出后很长一段时间内数据仍然可以使

c#中托管堆和堆栈

托管堆(Heap)和堆栈(Stack)是内存的逻辑划分.   栈 堆 连续性 连续 不连续 有序性 后进先出 无序 内存管理 操作系统自动释放 GC或人工 存放类型 值类型/引用 引用类型 注:内存格局通常分为四个区 全局数据区:存放全局变量,静态数据,常量: 代码区:存放所有的程序代码: 栈区:存放为运行而分配的局部变量,参数,返回数据,返回地址等: 堆区:即自由存储区.

类型,对象,堆栈和托管堆

C#的类型和对象在应用计算机内存时,大体用到两种内存,一个叫堆栈,另一个叫托管堆,下面我们用直角长方形来代表堆栈,用圆角长方形来代表托管堆. 首先讨论一下方法内部变量的存放. 先举个例子,有如下两个方法,Method_1和Add,分别如下: public void Method_1() { int value1=10; //1 int value2=20;    //2 int value3=Add(value,value); //3 } public int Add(int n1,int n2

浅谈C#堆栈与托管堆的工作方式(转)

C#初学者经常被问的几道辨析题,值类型与引用类型,装箱与拆箱,堆栈,这几个概念组合之间区别,看完此篇应该可以解惑. 俗话说,用思想编程的是文艺程序猿,用经验编程的是普通程序猿,用复制粘贴编程的是2B程序猿,开个玩笑^_^. 相信有过C#面试经历的人,对下面这句话一定不陌生: 值类型直接存储其值,引用类型存储对值的引用,值类型存在堆栈上,引用类型存储在托管堆上,值类型转为引用类型叫做装箱,引用类型转为值类型叫拆箱. 但仅仅背过这句话是不够的. C#程序员不必手工管理内存,但要编写高效的代码,就仍需

C#内存管理之托管堆与非托管堆( reprint )

在 .NET Framework 中,内存中的资源(即所有二进制信息的集合)分为“托管资源”和“非托管资源”.托管资源必须接受 .NET Framework 的 CLR (通用语言运行时)的管理(诸如内存类型安全性检查),而非托管资源则不必接受 .NET Framework 的 CLR 管理.(了解更多区别请参阅 .NET Framework 或 C# 的高级编程资料)托管资源在 .NET Framework 中又分别存放在两种地方:“堆栈”和“托管堆”(以下简称“堆”):规则是,所有的值类型(

struct对象可能分配在托管堆上吗

struct对象可能被分配在托管堆上吗? --会的. 比如当对struct装箱的时候,就会被分配在托管堆上. 比如,让一个struct实现一个接口. public interface IReport { string Name { get; } } public struct Score : IReport { public string Name { get { return "80分来自struct"; } } } 再来一个类负责打印接口属性值的类和方法. public class

.NET 托管堆和垃圾回收

托管堆基础 简述:每个程序都要使用这样或那样的资源,包括文件.内存缓冲区.屏幕空间.网络连接.....事实上,在面向对象的环境中,每个类型都代表可供程序使用的一种资源.要使用这些资源,必须为代表资源的类型分配内存.以下是访问一个资源所需步骤:1.调用IL指令newobj,为代表资源的类型分配内存.(C# new操作符)2.初始化内存,设置资源的初始状态.(一般指构造函数)3.访问类型的成员来使用资源.(使用成员变量.方法.属性等)4.摧毁资源的状态以进行清除.(???Dispose???)5.释

托管堆与垃圾收集

一.Windows内存架构简介 在用户态(user mode)中运行的进程通常会使用一个或多个堆托管器.最常见的堆管理器就是Windows堆管理器(windows heap manager).另一个常见的堆管理器就是CLR堆管理器,它是在.Net应用程序中使用. Windows堆管理器负责满足大多数的内存分配/回收请求,它从Windows虚拟内存管理器中分配大块内存空间(内存段),并且通过维持特定的数据记录和空闲列表,以一种高效的方式将大块内存空间分割为许多更小的内存块来满足进程的分配请求.CL