首页 > 其他分享 >浅谈 值类型和引用类型 在堆和栈中的存储

浅谈 值类型和引用类型 在堆和栈中的存储

时间:2024-06-19 17:45:13浏览次数:16  
标签:存储 浅谈 int MyInt result MyValue 类型 引用


浅谈 值类型和引用类型 在堆和栈中的存储

简介

本文将简单介绍什么是“栈”(stack)和“堆”(heap),并讨论值类型和引用类型在这两种内存结构中的存储方式。

栈和堆的概念

  • :后入先出(LIFO)的数据结构,由CLR管理,每个线程有自己的栈。
  • :存放较为零散,由Garbage Collector(GC)管理,整个进程共用。

黄金法则

  1. 引用类型总是被分配到“堆”上。
  2. 值类型总是分配到它声明的地方:
    • 作为引用类型的成员变量分配到“堆”上。
    • 作为方法的局部变量时分配到“栈”上。

方法示例

public int AddFive(int pValue) {
    int result;
    result = pValue + 5;
    return result;
}
  • 方法AddFive()及其参数pValue被压入栈。
  • 局部变量result也在栈上分配空间。
  • 方法执行完毕后,栈被清空。

值类型在堆上的分配示例

public class MyInt {
    public int MyValue;
}

public MyInt AddFive(int pValue) {
    var result = new MyInt();
    result.MyValue = pValue + 5;
    return result;
}
  • MyInt为引用类型,分配在堆上,栈上保存指针引用。
  • 函数执行完毕后,栈清空,MyInt类留在堆上,需GC处理。

值类型和引用类型的赋值示例

public int ReturnValue() {
    int x = 3;
    int y = x;
    y = 4;
    return x;
}
  • 返回值是3,因为yx的拷贝,修改y不影响x

引用类型赋值示例

public int ReturnValue() {
    var x = new MyInt();
    x.MyValue = 3;
    MyInt y;
    y = x;
    y.MyValue = 4;
    return x.MyValue;
}
  • 返回值是4,因为xy指向同一对象,修改y.MyValue影响x.MyValue

结语

本文介绍了栈和堆的基本概念以及值类型和引用类型在内存中的存储方式。如果有疑问或错误,欢迎交流。


标签:存储,浅谈,int,MyInt,result,MyValue,类型,引用
From: https://www.cnblogs.com/cqai/p/18256815

相关文章

  • 开辟一个存储空间以存放一个结构体数据
            在软件开发中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除。在C语言中是利用库函数malloc和free来分配和撤销内存空间的。C++提供了较简便而功能较强的运算符new和delete来取代malloc和free函数。注意:new和delete是运算符,不是函数,因此......
  • 华为OD机试真题-灰度图存储-2024年OD统一考试(官方D卷原题)
    介绍2024年OD统一考试(D卷),最新题库。5-11月份考试都是从本专栏中抽题,命中率百分之95。多语言解法,在线练习机试是在牛客考试,练习的时候也可以在牛客网练习,提前熟悉操作https://ac.nowcoder.com/acm/contest/5652/K点击上方链接进入牛客练习界面,可以自定义题目,自定义输入......
  • [转帖]JDBC 驱动程序类型
    https://www.jianshu.com/p/fce9ac03a250 什么是JDBC驱动说白了JDBC驱动就是一组实现了JDBCAPI接口的Java类的集合,该接口用于与数据库服务器进行交互。例如,使用JDBC驱动程序可以让你打开数据库连接,并通过发送SQL或数据库命令,然后通过Java接收结果。JDK中的......
  • IPv6转换技术是什么?浅谈IPv6转换的两种技术方式
    与双栈技术和隧道技术相比,IPv6转换技术具备改造周期短、成本低、部署灵活等优势,是目前各大政企网站进行IPv6升级改造的主要方式。采用协议转换实现IPv4到IPv6过渡的优点是不需要进行IPv4、IPv6节点的升级改造,缺点是用来实现IPv4节点和IPv6节点相互访问的方法比较复杂,网络设备......
  • MySQL存储引擎之MyISAM与InnoDB详解
    文章目录MySQL存储引擎之MyISAM与InnoDB详解MyISAM存储引擎MyISAM的特点InnoDB存储引擎InnoDB的特点InnoDB插入数据示例面试题总结解答为什么InnoDB一定要有一个主键?为什么主键要用整型?为什么主键建议使用自增?总结MySQL存储引擎之MyISAM与InnoDB详解在MySQL中,......
  • 255页10万字大数据中心架构、存储、基础设施建设和运维方案WORD(文末附123相关资料下载
    原文《大数据中心架构、大数据存储、数据中心基础设施建设和运维方案》更多参考资料及相关文档下载见文末​大数据中心架构是一个集数据存储、处理、分析和管理于一体的综合性平台。其设计旨在实现高效的数据吞吐、稳定的运行性能和灵活的资源扩展。整个架构采用分层设计,......
  • 【PL理论】(32) 类型系统:定义类型 τ ∈ TyVar = String | 定义类型环境 τ ∈ TyEnv
    ......
  • 变量、数据类型、表达式、运算符
    一、变量1.概念:计算机中的一块内存空间,存储数据的基本单元2.变量的组成部分:数据类型、变量名、数据3.语法: (1)先声明,再赋值数据类型变量名;inta;变量名=数据;a=5;(2)声明的同时赋值:数据类型变量名=值;intb=8;(3)同时定义多个同类型的变量:......
  • 理解 C++ 中的对象类型与绑定机制:静态绑定 vs 动态绑定
    静态绑定和动态绑定概念解释对象的静态类型:对象在声明时采用的类型,在编译期确定,无法更改。对象的动态类型:对象在运行期实际表现的类型,在运行期决定,对象的动态类型可以更改(通过多态和指针/引用的方式)。静态绑定:绑定的是对象的静态类型,某特性(比如函数调用)依赖于对象的静......
  • 浅谈配置元件之TCP取样器配置/TCP取样器
    浅谈配置元件之TCP取样器配置/TCP取样器1.引言在进行网络性能测试时,TCP取样器配置和TCP取样器(TCPSampler)是两个重要的组件,他们允许用户直接发送和接收TCP数据包,这对于测试服务器的TCP连接处理能力、模拟特定的TCP交互场景非常有用。本文档将详细介绍如何在JMeter中配......