学习笔记(一)堆栈储存 和 程序储存 的不同

堆栈储存程序存储是计算机内存中两种不同的存储方式,它们有不同的用途、管理方式和特性。以下是它们之间的主要区别:

1. 堆栈储存(Stack vs. Heap)

都是程序运行时用来存储数据的内存区域,但它们的用途、管理方式和存储数据的类型不同。

栈(Stack)
  • 用途:栈主要用于存储局部变量函数参数返回地址等信息。它在程序执行时自动管理内存。
  • 管理方式:栈是按照先入后出(LIFO)的顺序自动分配和释放内存。每次函数调用时,局部变量和返回地址被压入栈,函数返回后这些数据会自动从栈中弹出。
  • 分配与释放:内存分配速度非常快,因为它由操作系统或编译器自动管理。当函数结束时,栈上的内存会自动释放。
  • 内存大小:栈的大小通常有限(例如几MB),因此适合存储小而短期的变量或数据结构。
  • 生命周期:栈上分配的变量生命周期较短,局限于函数调用期间。函数返回后,栈上的数据会自动释放。
堆(Heap)
  • 用途:堆主要用于存储需要动态分配的内存,比如动态数组对象等。这些数据的大小可能无法在编译时确定。
  • 管理方式:堆的内存由程序员手动分配和释放。典型的操作包括malloc()free()(C语言)或newdelete(C++)。
  • 分配与释放:内存分配相对较慢,因为它需要查找合适大小的内存块。释放内存则需要程序员主动进行,否则会导致内存泄漏
  • 内存大小:堆的大小通常比栈大得多,可以占用系统可用内存的大部分。
  • 生命周期:堆上分配的内存可以比栈上的存活时间更长,直到程序员显式释放它为止,甚至可以跨函数调用。
总结:
  • 栈适合存储局部的、临时的数据,管理自动,性能高,但容量有限。
  • 堆用于存储动态分配的数据,容量大,但需要程序员手动管理内存,性能相对较慢。

2. 程序存储(Code/Data Segments)

程序存储指的是程序在运行时,计算机内存中专门用于存储程序代码和静态数据的区域。它通常包括代码段(Code Segment)和数据段(Data Segment)。

代码段(Code Segment)
  • 用途:代码段用于存储程序的可执行指令,也就是程序中的机器码。程序运行时,CPU会从代码段中读取指令并执行。
  • 管理方式:代码段是只读的,程序执行期间不能修改。它由操作系统在程序启动时加载,程序员无法直接操控它。
  • 分配与释放:代码段在程序启动时由操作系统分配,程序终止时自动释放。
  • 生命周期:代码段的生命周期从程序启动到程序结束,一直有效。
数据段(Data Segment)
  • 用途:数据段用于存储程序中的全局变量静态变量。这类变量在程序的整个生命周期中都存在,并且存储在数据段中。
  • 管理方式:数据段中的全局和静态变量由操作系统分配和管理,程序员只需要在编写代码时定义它们。
  • 分配与释放:数据段的内存在程序启动时分配,并在程序结束时释放。程序员不需要手动管理数据段内的变量。
  • 生命周期:数据段中的变量从程序开始到结束一直存在,生命周期较长。

3. 堆栈储存与程序存储的主要区别

4. 总结

  • 属于程序运行时的内存,用于存储动态数据和函数相关的局部变量。栈自动管理,适合短期、临时的数据,而堆则用于长生命周期的动态数据,需手动管理。
  • 代码段数据段则是程序执行时的静态存储,代码段存储程序指令,数据段存储全局和静态变量,它们的内存分配和管理由操作系统负责,程序员不直接干预。

PS:创作不易 看完如果觉得有用的话麻烦 点赞+关注+收藏 再走吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

门外的兔子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值