结构体并不在栈上:C# 究竟如何管理内存
来源:dev.to — 2026-10-01
📋 概述
文章拆穿了一条流传最广的 C# 迷思——「类在堆上、结构体在栈上」。作者指出真正的区别不是位置而是值语义与引用语义,CLR 的规则是值类型随其声明容器一起分配:局部变量确实在栈上,但结构体作为字段时会随对象躺在堆里,作为数组元素时会连续内联存放,被装进 object 时则被复制到堆上(装箱)。理解这一点才能避开意外的 GC 停顿和隐蔽的可变值 Bug。
🔑 核心要点
- CLR 的核心规则是值类型存在它的声明容器里,栈只是方法执行的一种实现细节。
- 结构体作为字段放进 class 时,数据随对象一起躺在堆上,并没有「逃到栈上」。
- 结构体数组的元素是连续内联存放的,这才是它性能优势的真正来源。
- 把结构体装进 object 会触发装箱,数据被复制到堆,原值不再共享。
- 混淆「类型是什么」与「它存在哪」,会带来意外的 GC 停顿和可变性 Bug。
💡 金句
值类型存在它的声明容器里——结构体并不要求一块栈空间,它只要求数据直接放在存储位置上,中间不加一层指针。
👍 0
👎 0
← 返回 dev.to 首页