冥界3大法王 发表于 2024-10-17 14:20

请道友们给我举一个在汇编过程中:用到“堆”x64dbg查看使用的实例!

下面是AI的自动回答?                               


用大白话解释一下什么是计算机的堆栈?计算机的堆栈可以想象成一个特殊的盘子架。这个架子有两层,每层都可以放盘子。

栈(Stack):栈就像是一个一端被封住的管道,你只能从另一端放盘子(叫做“压栈”或“入栈”),也只能从这一端取盘子(叫做“出栈”或“弹栈”)。特点是先进后出,就像你放盘子时,最后放的会在最上面,取的时候也是先取最上面的。
堆(Heap):堆就像是散乱的放在地上的盘子,你可以随时从任何地方拿一个盘子放东西,也可以随时从任何地方拿走一个盘子。堆没有固定的顺序,比较自由。
在计算机中,堆栈用来存储数据。栈主要用来存储临时数据,比如函数执行时需要的一些变量,用完就扔(出栈);而堆用来存储较长时间需要的数据,比如程序运行过程中一直需要用到的对象。
=================================================================================
堆(Heap)和栈(Stack)是计算机内存中用来存储数据的两个不同区域,它们的主要区别包括:
1. **管理方式**:
   - 栈:由操作系统自动管理。函数调用时会自动分配栈空间,函数返回时会自动释放栈空间。
   - 堆:需要程序员手动管理。使用堆空间时,通常需要通过代码来申请(malloc或new)和释放(free或delete)内存。
2. **生命周期**:
   - 栈:栈内存的生命周期通常很短,比如一个函数调用结束后,它的栈帧(包括其中的变量)就会被销毁。
   - 堆:堆内存的生命周期由程序员控制,可以持续到程序运行结束。
3. **大小限制**:
   - 栈:栈的大小通常有限,并且在程序启动时就已经确定。
   - 堆:堆的大小理论上受限于系统的可用内存,通常比栈要大得多。
4. **存取方式**:
   - 栈:遵循后进先出(LIFO)的原则,只能在栈顶进行插入和删除操作。
   - 堆:没有固定的存取顺序,可以随机访问堆中的任何位置。
5. **性能**:
   - 栈:由于栈的操作是固定的,通常栈的存取速度比堆要快。
   - 堆:由于需要手动管理,堆的分配和释放可能会比栈慢。
6. **用途**:
   - 栈:通常用于存储局部变量、函数调用的上下文、返回地址等。
   - 堆:通常用于存储程序中的对象和数据结构,如动态分配的数组、对象实例等。
7. **碎片化**:
   - 栈:由于固定的分配和释放方式,栈不太容易出现内存碎片。
   - 堆:频繁的分配和释放可能会导致堆内存碎片化。
了解这些区别有助于程序员更有效地管理内存,优化程序的性能。




我发现,我经常用的是 "栈" ,很少去用“堆”! {:301_974:}



               

woflant 发表于 2024-10-17 14:40

xdbg中,内存布局->右键->分配内存,分配的内存区域就是所说的“堆”;栈就是调试界面右下角小框中的内存区域

DEATHTOUCH 发表于 2024-10-17 14:41

你不是常用Delphi吗?

那么在Delphi你使用GetMem、TXxx.Create、SetLength、字符串等,里面的数据都是放在“堆”这个区域的呀。
而普通的变量和结构体,以及定长数组这些,就是放在“栈”里面的。

所以你天天在用堆,只是语言、库给你包装了一层,导致自己不清楚一直在使用。

冥界3大法王 发表于 2024-10-17 17:23

DEATHTOUCH 发表于 2024-10-17 14:41
你不是常用Delphi吗?

那么在Delphi你使用GetMem、TXxx.Create、SetLength、字符串等,里面的数据都是放 ...

所以后面还得跟一个明白先生。
页: [1]
查看完整版本: 请道友们给我举一个在汇编过程中:用到“堆”x64dbg查看使用的实例!