delphi中堆和栈的区别

delphi中堆和栈的区别

ID:13107464

大小:49.50 KB

页数:7页

时间:2018-07-20

delphi中堆和栈的区别_第1页
delphi中堆和栈的区别_第2页
delphi中堆和栈的区别_第3页
delphi中堆和栈的区别_第4页
delphi中堆和栈的区别_第5页
资源描述:

《delphi中堆和栈的区别》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、delphi堆和栈[转]2.1栈栈是由操作系统在创建线程的时候,系统自动创建,栈是由顶像下分配的,DELPHI中默认的栈大小是1M,这个可以通过Project->Options->Linker->MaxStacksize来改变其大小。栈是线程执行代码的地方,操作系统根据系统调度算法来加载执行的代码,另外栈还存放函数的参数值,局部变量。栈的存取是按4字节偏移,不会根据需要动态增长,因此超出范围会报栈溢出。2.2堆我们把在栈之外的分配内存都叫在堆上分配内存,堆是由程序员分配释放。在DELPHI中是用GetMem.inc中的代码来管理堆的,堆

2、中包含许多大小不确定的块。初始状态下,堆仅有一个块,即堆本身。经过一段时间地取用和回收以后,堆中将可能只剩下一些“切割”后残余的“碎片”,且这些碎片可能已经无法再合并。此时,如果一个新的请求大于任何一个碎片,那么就必须再申请一个新的、大的块放在堆中。堆的使用永远是一个“拆东墙补西墙”的过程。堆的大小是2G,在扩展内存模式下能达到3G。注意它与数据结构中的堆是两回事,它的分配方式类似于链表,访问“堆”的内容的时候需要先找到这个“堆”,然后再遍历链表,因此“堆”访问会比“栈”慢。2.3哪些在栈中2.3.1获取栈的首尾地址获取通常情况下的栈地

3、址在写汇编的时候,我们知道esp存放栈顶指针,ebp存放栈底指针procedureGetStackAddress(varAStackTop,AStackBottom:Cardinal);beginasmmov[eax],esp;//栈顶,eax接收第一个参数mov[edx],ebp;//栈底,edx接收第二个参数end;end;获取异常发生时的栈地址在Windows下,FS:[4]存放发生异常时的栈顶指针。procedureGetStackAddress(varAStackTop,AStackBottom:Cardinal);begin

4、asmmovecx,FS:[4];//FS:[4]放置发生异常时的栈信息subecx,3;mov[eax],eax;//栈顶,eax接收第一个参数mov[edx],ebp;//栈低,edx接收第二个参数end;end;知道了栈的首尾地址之后,我们就可以取出变量地址,然后和栈的地址比较,如果超出栈的范围,则表示变量在堆中。2.3.2基本数据类型:函数体中->栈;类中->堆基本数据类型(Integer、Cardinal、Shortint、Smallint、Longint、Int64、Byte、Word、LongWord、Char)在函数体内

5、分配是在栈中的,如果在类中分配则是在堆中的。另外Int64也是在栈中分配的,它具体的分配是偏移8字节。我们写下如下测试代码:procedureTestInt64;varValue:Int64;StackTop,StackBottom:Cardinal;beginValue:=10;GetStackAddress(StackTop,StackBottom);ShowMessage(Format('StackTop:%s,StackBottom:%s;Int64Address:%s',[IntToHex(StackTop,8),IntToH

6、ex(StackBottom,8),IntToHex(Integer(@Value),8)]));end;我电脑测试显示的信息为StackTop:0012F5E0,StackBottom:0012F628;Int64Address:0012F620,从上面信息我们可以看出栈底偏8字节就是Value的地址。2.3.3指针类型:指针->栈,指针的内容->堆指针在函数体内分配,指针的地址是在栈中的,指针的内容是在堆中的。指针如果在类中分配则,指针地址和指针内容都是在堆中的。我们写下如下测试代码:procedureTestPointer;var

7、APoint:Pointer;StackTop,StackBottom:Cardinal;beginGetMem(APoint,1000);GetStackAddress(StackTop,StackBottom);ShowMessage(Format('StackTop:%s,StackBottom:%s;PointerAddress:%s;PointerContentAddress:%s',[IntToHex(StackTop,8),IntToHex(StackBottom,8),IntToHex(Integer(@APoint),

8、8),IntToHex(Integer(APoint),8)]));end;我的电脑测试显示的信息为StackTop:0012F568,StackBottom:0012F5B8;PointerAddress

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。