C# 内存 栈、托管堆、非托管堆、静态数据区、常量数据区、程序代码区

一、栈、托管堆

一、C#中的值类型和引用类型

1、

在这里插入图片描述

2、值类型与引用类型的存储方式

1、值类型只需要一段单独的内存,用于存储实际的数据(单独定义的时候放在栈中)。
2、引用类型需要两段内存
(1)第一段存储实际的数据,它总是位于堆中。
(2)第二段是一个引用,指向数据在堆中的存放位置。
在这里插入图片描述

值类型:值类型总是分配在它声明的地方,做为局部变量时,存储在栈上;类对象的字段时,则跟随此类存储在堆中。
引用类型:引用类型存储在堆中。类型实例化的时候,会在堆中开辟一部分空间存储类的实例。类对象的引用还是存储在栈中。

3、值类型与引用类型的区别

值类型与引用类型都继承自Systerm.Object类。不同之处,几乎所有的引用类型都是直接从Systerm.Object继承,而值类型则是继承Systerm.Object的子类Systerm.ValueType类。
我们在给引用类型的变量赋值的时候,其实只是赋值了对象的引用;而给值类型变量赋值的时候是创建了一个副本(说通俗点,就是克隆了一个变量)。

二、堆与栈简单理解

C#程序在CLR上运行的时候,内存从逻辑上划分两大块:栈,堆。这俩基本元素组成我们C#程序的运行环境。

1、堆与栈概念介绍

堆:在c里面叫堆,在c#里面其实叫托管堆。

栈:就是堆栈,因为和堆一起叫着别扭,就简称为栈。

2、托管堆

托管堆不同于堆,它是由CLR(公共语言运行库(Common Language Runtime))管理,当堆中满了之后,会自动清理堆中的垃圾。所以,做为.net开发,我们不需要关心内存释放的问题。

3、内存堆栈与数据堆栈

1、内存堆栈:存在内存中的两个存储区(堆区,栈区)。

(1)栈区:存放函数的参数、局部变量、返回数据等值,由编译器自动释放。
(2)堆区:存放着引用类型的对象,由CLR释放。
2、数据堆栈:是一种后进先出的数据结构,它是一个概念,主要是栈区。

三、堆与栈区别分析

栈内存无需我们管理,也不受GC管理。当栈顶元素使用完毕(栈空间内值变量出了作用域后),系统能自动回收的
而堆则需要GC清理。

四、堆与栈存储讲解

我们把内存分为堆空间和栈空间,区别如下:

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

1、栈的深入讲解

栈(Stack)最明显的特征就是“先进后出”,本质上讲堆栈也是一种线性结构
在这里插入图片描述

2、堆的深入讲解

堆(Heap)是一块内存区域,与栈不同,堆里的内存能够以任意顺序存入和移除

五、GC(Garbage Collection)垃圾收集器介绍

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

在这里插入图片描述


三、非托管堆

  • 非托管堆用于存储非托管代码(如C++)中分配的对象。
  • 非托管代码通过内存分配函数(如 malloc)来创建和管理非托管堆。

四、静态数据区

  • 静态数据区用于存储静态变量(包静态字段、静态属性和静态方法),这些变量在程序的整个生命周期内存在。
  • 这些变量在编译时就被分配并初始化,存储在程序的数据段中。

五、常量数据区

  • 常量数据区用于存储常量值,如字符串常量。
  • 这些常量值在编译时就被确定,存储在程序的数据段中。

六、程序代码区

  • 程序代码区存储编译后的程序指令。
  • 这些指令在程序运行时被执行。
      



posted @ 2023-08-28 10:41  不争丶  阅读(614)  评论(0编辑  收藏  举报