临时确保局部变量使用的内存空间

简介: 临时确保局部变量使用的内存空间

   我们知道,局部变量是临时保存在寄存器和栈中的。函数内部利用栈进行局部变量的存储,函数调用完成后,局部变量值被销毁,但是寄存器可能用于其他目的。所以,局部变量只是函数在处理期间临时存储在寄存器和栈中的


       回想一下上一篇博客是不是定义了10个局部变量?这是为了表示存储局部变量的不仅仅是栈,还有寄存器。为了确保c1-c10所需的域,寄存器空闲的时候就会使用寄存器,寄存器空间不足的时候就会使用栈


       让我们继续来分析上面代码的内容。_TEXT 段定义表示的是 MyFunc 函数的范围。在MyFunc 函数中定义的局部变量所需要的内存领域。会被尽可能的分配在寄存器中。大家可能认为使用高性能的寄存器来替代普通的内存是一种资源浪费,但是编译器不这么认为,只要寄存器有空间,编译器就会使用它。由于寄存器的访问速度远高于内存,所以直接访问寄存器能够高效的处理。局部变量使用寄存器,是Borland C++编译器最优化的运行结果


代码清单中的如下内容表示的是向寄存器中分配局部变量的部分


mov    eax,1
mov    eax,2
mov    eax,3
mov    eax,4
mov    eax,5


 仅仅对局部变量进行定义是不够的,只有在给局部变量赋值时,才会被分配到寄存器的内存区域。上述代码相当于就是给5个局部变量c1-c5分别赋值为1-5.eax、edx、ecx、ebx、esi是x86系列32位CPU寄存器的名称。至于使用哪个寄存器,是由 编译器 来决定的


       x86系列CPU拥有的寄存器中,程序可以操作的是十几,其中空闲的最多会有几个。因而,局部变量超过寄存器数量的时候,可分配的寄存器就不够用了,这种情况下,编译器就会把栈派上用场,用来存储剩余的局部变量


       在上述代码这一部分,给局部变量c1-c5分配完寄存器后,可用的寄存器数量就不足了。于是,剩下的5个局部变量c6-c10就被分配给了栈的内存空间。如下面代码所示:


mov     dword ptr [ebp-4],6
mov     dword ptr [ebp-8],7
mov     dword ptr [ebp-12],8
mov     dword ptr [ebp-18],9
mov     dword ptr [ebp-20],10


 函数入口 add esp,-20 指的是,对栈数据存储位置的esp 寄存器(栈指针)的值做减20的处理。为了确保内存变量c6-c10在栈中,就需要保留5个int类型的局部变量(4字节*5=20字节)所需的空间。mov ebp,esp 这行指令表示的意思是将esp 寄存器的值赋值到ebp 寄存器。之所以需要这么处理,是为了通过在函数出口处 mov esp ebp 这一处理,把esp 寄存器的值还原到原始状态,从而对申请分配的栈空间进行释放,这时栈中用到的局部变量就消失了。这也是栈的清理处理。在使用寄存器的情况下,局部变量则会在寄存器被用于其他用途时自动消失,如下图所示:



用于局部变量的栈空间的申请分配和释放:


mov     dword ptr [ebp-4],6
mov     dword ptr [ebp-8],7
mov     dword ptr [ebp-12],8
mov     dword ptr [ebp-18],9
mov     dword ptr [ebp-20],10


   这五行代码是往栈空间代入数值的部分,由于在向栈申请内存空间前,借助了 mov,ebp,esp 这个处理,esp寄存器的值被保存到了esp寄存器中,因此,通过使用[ebp-4]、[ebp-8]、[ebp-12]、[ebp-16]、[ebp-20]这样的形式,就可以申请分配20字节的栈内空间切分5个长度为4字节的空间来使用。例如、mov dword ptr [ebp-4],6 表示的就是,从申请分配的内存空间的下端(ebp寄存器指示的位置)开始向前4个字节的地址([ebp-4])中,存储着6这一字节数据


将栈内存空间进行分割:


目录
相关文章
|
7月前
|
Java
JVM之本地内存以及元空间,直接内存的详细解析
JVM之本地内存以及元空间,直接内存的详细解析
481 0
|
4月前
|
存储 开发框架 .NET
"揭秘.NET内存奥秘:从CIL深处窥探值类型与引用类型的生死较量,一场关于速度与空间的激情大戏!"
【8月更文挑战第16天】在.NET框架中,通过CIL(公共中间语言)可以深入了解值类型与引用类型的内存分配机制。值类型如`int`和`double`直接在方法调用堆栈上分配,访问迅速,生命周期随栈帧销毁而结束。引用类型如`string`在托管堆上分配,堆栈上仅存储引用,CLR负责垃圾回收,确保高效且自动化的内存管理。
57 6
|
1月前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
730 2
|
3月前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
209 5
|
4月前
|
算法 安全 UED
探索操作系统的内核空间:虚拟内存管理
【7月更文挑战第50天】 在现代操作系统中,虚拟内存管理是核心功能之一,它允许操作系统高效地使用物理内存,并为应用程序提供独立的地址空间。本文将深入探讨操作系统虚拟内存管理的机制,包括分页、分段以及内存交换等关键技术,并分析它们如何共同作用以实现内存的有效管理和保护。通过理解这些原理,读者可以更好地把握操作系统的内部工作原理及其对应用程序性能的影响。
|
5月前
|
Java fastjson C++
JVM内存问题之JVM中元空间持续增长并且GC无法释放的原因可能是什么
JVM内存问题之JVM中元空间持续增长并且GC无法释放的原因可能是什么
259 2
|
5月前
|
运维 DataWorks 安全
DataWorks产品使用合集之如何查看空间资源、CPU、内存和存储空间容量
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
7月前
|
存储 缓存 Java
释放C盘空间:释放Windows休眠文件和关闭虚拟内存
在 Windows 11 专业版中,可以通过以下步骤来释放休眠文件(Hibernate File),以释放磁盘空间。休眠文件是系统休眠(Hibernate)功能所需要的文件,它保存了系统的当前状态,以便在休眠状态下恢复。如果你不使用休眠功能,如果因为C盘空间不足,可以考虑释放这个文件来腾出磁盘空间。
17691 1
|
6月前
|
算法 Java
垃圾回收机制(Garbage Collection,GC)是Java语言的一个重要特性,它自动管理程序运行过程中不再使用的内存空间。
【6月更文挑战第24天】Java的GC自动回收不再使用的内存,关注堆中的对象。通过标记-清除、复制、压缩和分代等算法识别无用对象。GC分为Minor、Major和Full类型,针对年轻代、老年代或整个堆进行回收。性能优化涉及算法选择和参数调整。
79 3