前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >[c语言日寄]计算机内存区域总览与关于函数栈帧的小知识

[c语言日寄]计算机内存区域总览与关于函数栈帧的小知识

作者头像
siy2333
发布2025-02-05 12:46:55
发布2025-02-05 12:46:55
620
举报
文章被收录于专栏:来自csdn的博客来自csdn的博客

什么是栈?什么是堆?函数是如何被调用的? 博主在元旦为您呈上一个简单介绍~

计算机内存区域总览

栈(Stack)

  • 栈是用于存储局部变量和函数调用信息的内存区域。它遵循后进先出的原则,即最后存储的数据最先被访问。
  • 栈从高地址向低地址方向生长,由编译器自动管理。当函数被调用时,栈空间会被分配,函数返回时,栈空间会被释放。
  • 栈的大小通常固定且容量有限,它适合存储生命周期短的数据。

堆(Heap)

  • 堆用于动态内存分配,其大小可以根据程序的需要在运行时进行调整。
  • 与栈不同,堆的管理需要程序员手动进行,通过mallocnew等函数分配内存,以及freedelete等函数释放内存。
  • 堆容易产生内存碎片,适合存储大对象或需要长时间存在的数据。

全局/静态存储区(Global/Static Storage Area)

  • 这个区域用于存储全局变量和静态变量,它们在整个程序的生命周期内都存在。
  • 这个区域可以分为数据段(Data Segment),存放已初始化的全局变量和静态变量,以及BSS段(Block Started by Symbol),存放未初始化的全局变量和静态变量。

常量存储区(Constant Storage Area)

常量存储区用于存储程序中的常量数据,如字符串常量和其他只读数据。这些数据在程序运行期间不可修改,通常存储在只读内存区域。

程序代码区(Code Area)

  • 程序代码区用于存储程序的可执行代码,包括函数体的二进制代码。
  • 这个区域通常是只读的,以防止程序意外修改自身代码。
  • 程序代码区在程序加载时分配,在程序结束时释放。

寄存器(Registers)

寄存器是CPU内部的高速存储器,用于存储临时数据和指令。它们的速度极快,容量极小,直接由CPU访问,用于快速计算和数据传输。

函数栈帧

寄存器的作用

在函数调用过程中,寄存器如ebp(栈低指针)和esp(栈顶指针)扮演着重要的角色。这两个寄存器中存放的是地址,用来维护正在调用的函数的函数栈帧。

相关知识

  • 至少在Visual Studio 2013中,main函数是被其他函数调用的。
  • 压栈是将一个元素放到栈顶,而出栈则是从栈顶移除一个元素。

函数调用

  • 每一个函数调用都需要在栈区创建一个空间。
  • 参数传递时,先传递参数(压栈),后调用函数
  • 参数从右往左传递。
  • 形参和实参的关系是值相同,但内存空间独立。

函数结束后返回

  • 函数调用后的下一条指令的地址会被保存到内存里,在调用结束后按照地址返回。
  • 结束调用后,ebpesp的值会被更新以回收内存空间,但内存的值不变。
  • return函数会将返回值放到寄存器,因此返回值不会随着内存空间回收而失效。

局部变量分配内存

  • 局部变量在函数栈帧中分配。
  • 局部变量未初始化时为随机值,这个随机值是在函数栈帧创建时初始化的值。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 计算机内存区域总览
    • 栈(Stack)
    • 堆(Heap)
    • 全局/静态存储区(Global/Static Storage Area)
    • 常量存储区(Constant Storage Area)
    • 程序代码区(Code Area)
    • 寄存器(Registers)
  • 函数栈帧
    • 寄存器的作用
    • 相关知识
    • 函数调用
    • 函数结束后返回
    • 局部变量分配内存
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档