值类型和引用类型在内存上的存储区域

本文详细介绍了编程中值类型和引用类型的概念及其在内存中的存储位置。值类型包括int、double等,直接存储在栈中;引用类型如string、自定义类,则将对象存储在堆中,并通过栈中的变量指向其内存地址。

程序员开发经常涉及到的内存区域:堆、栈、静态存储区域。

值类型和引用类型的区别:

  1. 值类型和引用类型在内存上存储的地方不一样。值类型的值是存储在内存的栈当中。引用类型的值是存储在内存的堆中。
  2. 在传递值类型和传递引用类型的时候,传递方式不一样。值类型我们称之为值传递,引用类型我们称之为引用传递。

本章节,暂时只介绍第1个区别:值类型和引用类型在内存上的存储区域。

 

常用值类型:int、double、bool、char、decimal、struct、enum

常用引用类型:string、自定义类、数组


 

 1.值类型存储图解:

 


 

 2.引用类型-字符串存储图解:

 

 


 

3.引用类型-自定义类存储图解:


 

 引用类型存储总结:

引用类型的对象存储在堆中,并且会分配一个内存地址。该内存地址会存储到栈空间,栈空间名为变量名。

即读取引用类型对象的顺序:变量—>内存地址—>实例对象。

转载于:https://www.cnblogs.com/green-jcx/p/9391720.html

### 值类型引用类型存储方式及使用机制差异 在编程语言中,值类型(Value Types)引用类型(Reference Types)是两种重要的数据类型分类。它们在存储方式使用机制上存在显著差异。 #### 存储方式的差异 值类型的数据直接存储内存中的具体位置,通常是(Stack)[^2]。例如,在 Golang 中,当定义一个整数变量 `x := 10` 时,该变量的值直接存储中[^1]。这种存储方式使得值类型的访问速度较快,因为它不需要通过额外的指针来间接访问数据。 引用类型的数据存储分为两部分:引用本身存储中,而实际数据存储在堆(Heap)中[^2]。例如,在 C# 或 Java 中,当创建一个对象 `string s = "hello"` 时,`s` 是一个引用,它存储中,指向堆中实际的字符串数据[^3]。这种方式允许引用类型共享同一块内存区域,从而节省内存并支持复杂的数据结构。 #### 使用机制的差异 值类型在传递时会复制其内容。这意味着每次将值类型作为参数传递给函数或赋值给另一个变量时,都会创建一个新的副本[^2]。例如,在 Golang 中: ```go func modify(x int) { x = 10 } a := 5 modify(a) fmt.Println(a) // 输出仍为 5,因为传入的是副本 ``` 引用类型在传递时只复制引用的副本,而不是实际数据[^2]。因此,对引用类型的修改可能会影响原始数据。例如,在 C# 中: ```csharp void Modify(List<int> list) { list.Add(10); } List<int> numbers = new List<int>(); Modify(numbers); Console.WriteLine(numbers.Count); // 输出为 1,因为列表被修改 ``` #### 性能与开销 值类型的性能通常优于引用类型,尤其是在频繁操作时。这是因为值类型避免了装箱(Boxing)拆箱(Unboxing)的开销[^3]。例如,在循环中对基本数据类型进行操作时,性能表现更佳。 引用类型涉及更多的内存管理开销,包括垃圾回收(Garbage Collection)动态内存分配[^4]。此外,引用类型的装箱拆箱过程可能会导致性能下降,特别是在需要大量数据操作的场景中。 #### 示例代码对比 以下是一个简单的对比示例,展示值类型引用类型在不同语言中的行为: **Golang 值类型示例:** ```go package main import "fmt" func modify(x int) { x = 10 } func main() { a := 5 modify(a) fmt.Println(a) // 输出 5,因为传入的是副本 } ``` **C# 引用类型示例:** ```csharp using System; using System.Collections.Generic; class Program { static void Modify(List<int> list) { list.Add(10); } static void Main() { List<int> numbers = new List<int>(); Modify(numbers); Console.WriteLine(numbers.Count); // 输出 1,因为列表被修改 } } ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值