C# “值类型“和“引用类型“在内存的分配

简介: C# “值类型“和“引用类型“在内存的分配

在代码中每创建一个变量,程序运行时都会在内存开辟一些空间存储这些值,所以写程序时创建的变量是越少越好(不积小流,无以成江海 -荀子)…

存储方式:

“值类型”存储于内存中的“”上

"引用类型"存储于内存中的“”上

静态类及变量存储于内存中的“静态存储区

值类型有哪些?

int"整数"

double"高精度小数"

char(单字符)

decimal(小数)

bool(布尔)

enum(枚举)

struct(结构)

等等…

引用类型有哪些?

string

数组

自定义类

集合

object

接口

等等…

值类型内存分配:

值类型是存储于栈上

int i =50;

其中的0x2489(并非固定值)表示内存中的地址,并把50存储在里面,值改变时内存地址并不会变化,而是直接原值覆盖,这是值类型的内存分配


如果按下面写内存该怎么分配,开辟新空间,还是同时指向一个内存

int a =20;

int b =a;

两个地址不是相同的,说明是开辟了新空间


引用类型内存分配:

引用类型存储于堆,

string s =“富强民主”;

栈的地址指向了在堆中的地址

其中字符串(string)比较特殊,字符串每重新赋值,并不会覆盖原值,而是开辟新空间存储

string a =“富强民主”;

a=“文明和谐”;

a=“自由平等”;


string a = “1”;

a = “2”;

a = “3”;

a = “4”;

可以看出每一次堆的地址都改变了,都开辟了新的内存,并不是覆盖


string a =“123”;

string b =“123”;

因为内容相同,他在堆中用的是同一块内存

栈中的地址 0X0058ee98

堆中的地址 0X027c233c

可以看出 a 和 b 的地址是一样的,说明指向的是同一块内存


如果其中有一个值方式变化则会开辟新空间

string a = “123”;

string b = “123”;

b = “6”;

堆中地址发生改变

静态存储区:

静态存储区,分别存放静态类或者方法,被static关键字修饰的都存储于静态存储区,他们在程序运行时即开辟空间,程序关闭时才会释放内存, 被stat修饰可以通过对象名进行调用而不用实例化,还有常量等,常量也就是不会变的值,值并不会发生改变,也存储于这个区域

纯手打,点个赞呗~

相关文章
|
4月前
|
存储 开发框架 .NET
"揭秘.NET内存奥秘:从CIL深处窥探值类型与引用类型的生死较量,一场关于速度与空间的激情大戏!"
【8月更文挑战第16天】在.NET框架中,通过CIL(公共中间语言)可以深入了解值类型与引用类型的内存分配机制。值类型如`int`和`double`直接在方法调用堆栈上分配,访问迅速,生命周期随栈帧销毁而结束。引用类型如`string`在托管堆上分配,堆栈上仅存储引用,CLR负责垃圾回收,确保高效且自动化的内存管理。
57 6
|
1月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
109 13
|
2月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
83 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
2月前
|
Java 测试技术 Android开发
让星星⭐月亮告诉你,强软弱虚引用类型对象在内存足够和内存不足的情况下,面对System.gc()时,被回收情况如何?
本文介绍了Java中四种引用类型(强引用、软引用、弱引用、虚引用)的特点及行为,并通过示例代码展示了在内存充足和不足情况下这些引用类型的不同表现。文中提供了详细的测试方法和步骤,帮助理解不同引用类型在垃圾回收机制中的作用。测试环境为Eclipse + JDK1.8,需配置JVM运行参数以限制内存使用。
37 2
|
2月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
60 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
2月前
|
C# 开发工具 Windows
C# 获取Windows系统信息以及CPU、内存和磁盘使用情况
C# 获取Windows系统信息以及CPU、内存和磁盘使用情况
66 0
|
3月前
|
存储 Java C#
C# 中的值类型与引用类型
在 C# 编程中,值类型和引用类型的区别至关重要,直接影响内存管理、性能优化及编程模式选择。值类型直接存储数据(如 `int`、`float`),而引用类型存储数据的引用地址(如 `class`、`string`)。值类型的赋值涉及数据复制,适合小数据量;引用类型仅复制引用,适合大数据量处理但需关注垃圾回收。本文通过具体代码示例详细解析二者的定义、存储方式及性能影响,并提供实战案例分析及易错点避免方法,帮助读者更好地理解和应用。
86 2
|
4月前
|
关系型数据库 MySQL
MySQl优化:使用 jemalloc 分配内存
MySQl优化:使用 jemalloc 分配内存
|
4月前
|
缓存 Java 编译器
Go 中的内存布局和分配原理
Go 中的内存布局和分配原理