[翻译]关于堆和堆栈
对于堆(heap)和堆栈(stack),尽管说过很多次,不过一直都不是很清楚。个人认为这篇帖子说的还是比较好懂的,便翻译了过来。有些地方可能不太准确,因此后面附上了原文。
堆栈用于存储临时值。当你调用一个函数时,n字节被分配到堆栈的顶层,其中n是所有局部变量的字节之和。一个用于标记自身的特殊函数所占用的区域,我们称之为堆栈帧。由于每个函数都可以调用其他函数,因此最终将会得到一连串的堆栈帧,每一个都会在另一个之上。当一个函数退出的时候,它的堆栈帧也被销毁,最后里面所有的东西都将丢失。
当你用完了堆栈空间的时候将会发生堆栈溢出。一般说来,当一个函数试图无限次的调用自身的时候会出现这种错误,因为这将导致无穷尽需要字节分配的堆栈帧。
堆基本上算是一个无尽的内存块(The Heap is basically a bottomless pool of memory)。只要你不确定什么时候需要一大块的内存(Whenever you need a chunk of memory for an indefinite amount of time),那么它将会从堆上分配。C#中的堆可能看起来更象堆栈一些,但是基于传统我们仍然称之为堆。
引用类型,比如我们所熟知的对象,它总是存储在堆里。没有方法可以将它存储于堆栈中。对它的引用或者指向它的指针可以被存储在堆栈里或者是另一个对象里。只要有至少一个引用指向它,那么它就将一直存在。
值类型,比如我们所熟知的结构,可以被存储在堆栈里或者是一个对象里。如果是在堆栈里,只要堆栈帧存在,它就将存在。
值类型可以被装箱(box)。这意味着程序试图将其作为引用类型并放入到堆中。
分类:
OOA/OOD/OOP
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】