内存中的堆栈
大概的几个分区
- 程序代码区:存放函数体的二进制代码
- 栈区:由编译器自动分配释放,存放函数的参数值和局部变量等
- 堆区:由程序员分配释放(new),或者可以由垃圾回收机制回收
- 全局区:全局变量和静态变量的存储
栈
栈(stack)又名堆栈是操作系统在建立某个进程时或者线程,为这个线程建立的存储区域,在编译的时候可以指定需要的栈的大小
栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。
堆
用于动态分配内存,c语言中使用malloc/free进行申请和释放。申请空间这种事一般都是有操作系统来做,但是在编程是我们需要经常申请空间,就需要经常调用系统代码。在用户状态与内核态之间切换,也就是频繁的调用中断处理程序,导致性能较差,但事实上不是这样的,比如在写c语言代码时,都是通过调运运行库封装好的库函数,而库函数里提前申请好一段适当大的内存,给编程用,当我们需要申请空间时,对于小空间直接向库函数里取相应大小的空间即可,这样就提高了性能
堆和栈区的区别
栈区:存储函数参数,占据连续的存储空间
堆区:由程序员分配和释放,不占用连续的空间,容易造成内存碎片
- 管理方式不同:栈由编译器管理;堆由程序员管理
- 空间大小不同:win32中,堆可达4G;VC中栈默认1M(可以修改)
- 生长方向不同:堆生长方向是向上的,也就是向着内存增加的方向;栈相反。
- 分配效率不同:栈,系统提供底层支持,有专门的寄存器存放栈地址,效率高;堆,由库函数提供支持,效率底。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2020-08-08 Keras入门(沧海一笑 rush)