栈和堆的概念

一、比方

  • 栈(Stack)= 随身口袋 / 桌面 空间小、拿放东西超快,用完随手清空,自己自动收拾,不用你管。
  • 堆(托管堆 Managed Heap)= 大仓库 空间超大、放大件东西,放进去慢,自己不会自动收拾,要等保洁阿姨(GC 垃圾回收)来清理。

二、栈 Stack(线程栈)

特点

  1. 自动分配、自动销毁 进入方法就开辟空间,方法执行完立马清空。
  2. 速度极快,内存是连续的。
  3. 存放什么
    • 局部值类型:int、double、bool、struct、DateTime

    • 引用类型的地址(指针) (不是对象本身,只是仓库门牌号)

      cs 复制代码
      void Test()
      {
          int a = 10;     // 直接放栈上
          string s;       // 栈上存一个地址位置,暂时没指向仓库
      }
      // 方法结束 → 栈直接清空,a、s 全部消失

      一句话 栈就是临时工作台,方法用完就扔,自动清理。

三、托管堆

C# 里说的堆 ,默认就是托管堆。

特点

  1. 空间巨大,可以存很大、很多对象。
  2. 不会自动释放 ,靠 GC 垃圾回收 定时清理没人用的对象。
  3. 存放什么
    • new 出来的所有引用类型对象

    • class 实例、字符串、数组、集合 List 等真实本体数据

      cs 复制代码
      string s1 = "abc";
      Person p = new Person();
    • 栈上:s1、p 只存地址编号

    • 托管堆:真正存 "abc" 字符串、Person 对象的所有数据

一句话

堆就是大仓库,放引用类型真实数据,GC 帮你打扫垃圾。

cs 复制代码
string s1 = "abc";
string s2 = s1;
s2 = "def";

内存全过程:

  1. s1 在栈 上,存一个地址 → 指向托管堆 里的 "abc"
  2. s2 = s1:栈上复制地址 ,s1、s2 都指向堆里同一个 "abc"
  3. s2 = "def":在托管堆新建 "def" ,把 s2 栈上的地址改成新地址
    • s1 还指着老的 "abc",所以s1 不变

总结

特性 栈 Stack 托管堆 Heap
大小 小 超大
速度 极快 较慢
谁管理 系统自动,方法结束就清 GC 垃圾回收定时清理
存什么 值类型、引用类型的地址 new 出来的对象、字符串、数组本体
生命周期 随方法消失 没人引用了才被 GC 回收

值类型放栈上,用完自动亡;引用地址蹲栈上,对象本体住堆仓。

相关推荐
流形填表2 小时前
题库去重实战:基于题干指纹的重复题清理
开发语言·c#
开开心心就好8 小时前
以图搜图找重复图片,本地工具离线就能用
javascript·智能手机·ffmpeg·c#·ocr·word·音视频
QQ_21696290969 小时前
基于C#(Asp.net)电竞陪玩信息管理系统的设计与实现
java·大数据·spring boot·微信小程序·c#·云计算·asp.net
未来之窗软件服务18 小时前
C# 截图源码支持自动保存-东方仙盟
c#·仙盟创梦ide·东方仙盟·电脑工具
UIU1141 天前
-7 / 2 在 C 里是 -3,在 Python 里是 -4,谁算错了?
c++·学习·c#
wflynn1 天前
GitHub 今日推荐|REDox:64 位 token 表示结构化数据,内存占用降 70% 支持多格式互转
开源·c#·github
驰骋工作流1 天前
C#/.NET 开源BPM工作流引擎6大常用对比选型分析驰骋BPM驰骋低代码低代码工作流引擎
开源·c#·.net
en.en..1 天前
C语言 fp与fd 区别详解
c#
淡海水2 天前
02-02-原理篇-分代GC
算法·unity·c#·游戏引擎·.net·gc
BD_Marathon2 天前
多轮对话聊天机器人
开发语言·机器人·c#