memory
文章平均质量分 62
hnxxcxg
这个作者很懒,什么都没留下…
展开
-
system单元的几个内存处理方法
system单元几个内存处理方法1.Move - 移动内存块 var Source,Dest: string;begin Source := 123456789; Dest := ---------; Move(Source[5], Dest[3], 4); ShowMessage(Dest); {--5678---}end;2.System.New、System.D原创 2008-05-03 16:54:00 · 392 阅读 · 0 评论 -
複製內存
MoveMemory、CopyMemory 的功能是一模一样的, 都是复制内存, 都是调用 Move 过程;MoveMemory、CopyMemory 操作指针; Move 操作实体.还要注意, 它们的参数位置不一样! 举例: {例1}var buf1,buf2: array[0..9] of AnsiChar;begin buf1 := 0123456789转载 2009-09-29 10:04:00 · 940 阅读 · 0 评论 -
給結構體指針分配內存
使用结构或结构数组, 一般是不需要主动分配内存的, 譬如: var pts: TPoint;begin pts.X := 1; pts.Y := 2; ShowMessageFmt(%d,%d, [pts.X, pts.Y]); {1,2}end;//结构数组:var Arr: array[0..2] of TPoint; i:转载 2009-09-29 09:47:00 · 1048 阅读 · 0 评论 -
内存管理四
<br />一个使用私有堆的例子:unit Unit1;<br />interface<br />uses<br /> Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br /> Dialogs, StdCtrls;<br />type<br /> TForm1 = class(TForm)<br /> Button1: TButton;<br /> procedure Button1Click(Sen转载 2010-06-17 16:31:00 · 281 阅读 · 0 评论 -
内存管理五
<br />本例在建立一个新的堆前后分别通过 GetProcessHeaps 函数获取了当前进程的堆句柄列表, 没想到一个最简单的程序也有 5 个堆. <br /><br />效果图:<br /><br />unit Unit1; interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm)转载 2010-06-17 16:41:00 · 272 阅读 · 0 评论 -
虚拟内存
<br />虚拟内存<br />操作系统为程序员提供了超过物理内存限制的浮动内存模型。当系统需要的内存超过了物理内存时,可以使用硬盘中的交换文件在内存和硬盘之间进行页交换操作。不管目标机器安装了多少物理内存,都会有2GB的虚拟内存供开发人员使用,操作系统会自动实现内存到硬盘的映射。 <br /> 每一个进程都有自己的4GB虚拟内存。低地址的2GB由开发人员支配。高地址的2GB只供操作系统使用。内存管理API函数只是从低地址的2GB分配所需的内存。原创 2010-06-16 08:41:00 · 334 阅读 · 0 评论 -
内存分配函数分类
<br />有4种用于内存分配的API函数。虚拟VIRTUAL函数用于分配和管理大数量的内存,堆函数HEAP用于小数量内存,全局函数GLOBAL及局部函数LOCAL用于小数量内存分配,这两类函数是为了实现与16位系统兼容而提供的。WIN32 API仍然维护全局以及局部的堆函数,但是它们都是从局部的2GB中分配内存。这些堆对于进程而言都是局部的,不能被其他进程访问。<br /> 当一个程序需要分配一个至少几KB缓存时,使用VIRTUALALLOC函数获得内存块。它以4KB为单位获取内存,分配的内存原创 2010-06-16 09:11:00 · 341 阅读 · 0 评论 -
到底有多少内存
<br /> 在虚拟内存模型下,理论上有2GB的内存供程序使用。当VIRTUALALLOC或者其他函数提交虚拟内存时,虚拟内存管理器就开始消耗RAM。当物理内存将被消耗完时,管理器就开始将内存页面映射到硬盘。在默认的设置下,操作系统会用硬盘的所有可用空间来作为磁盘交换文件。因此,内存的限制并不是2GB的理论限制,而是RAM加上硬盘可用交换文件空间。2GB的虚拟内存空间对于进程是私有的。硬盘交换文件对于操作系统和所有正在执行的任务而言是共享资源。原创 2010-06-16 19:02:00 · 288 阅读 · 0 评论 -
内存管理六
跨进程的内存分配Delphi 为我们提供了三个方便的函数:GlobalAllocPtr {简化自 API 的 GlobalAlloc} GlobalReAllocPtr {简化自 API 的 GlobalReAlloc} GlobalFreePtr {简化自 API 的 GlobalFree}读写本程序以外的数据时可以使用它们, 很方便, 譬如:p := GlobalAllocPtr(0, Len); {分配} p := GlobalReAllocPtr(p, Len, 0); {转载 2010-06-17 16:43:00 · 267 阅读 · 0 评论 -
内存映像文件
<br />象使用虚拟内存一样,使用内存映像文件同样需要经过保留和提交两个过程,首先在进<br />程内存空间保留一块区域,然后提交物理存储给这段区域。不同的是物理存储来自于磁<br />盘上的文件,而不是系统的分页文件。也即将磁盘上指定的数据文件作为虚拟内存,这<br />个实现过程被称为文件映像,可以将文件全部或部分映像到进程的地址空间中。文件映<br />像过以后,可以把文件映像的部分当作已全部被载入内存一样的去访问它,这时又称它<br />为内存映像文件。<br />内存映像文件使用步骤<br />原创 2010-06-16 21:46:00 · 905 阅读 · 1 评论 -
内存管理二
<br />系统给程序的地址数是 4G, 为什么不是 3G 或 5G? 因为 32 位的指针的最大值就是 $FFFFFFFF, 它不能表示更多了, 究其根源这要回到 CPU 的寻址能力、地址总线等等.<br /><br />在 Win64 下, 系统给程序的地址数达到了 16EB(0 - $FFFFFFFFFFFFFFFF), 也就是 18446744073709551616 个. 不过 Win64 还没有普及, 我们还得回到实际的 Win32.<br /><br />就这 4G 的地址, 系统还要留下一半原创 2010-06-17 16:36:00 · 303 阅读 · 0 评论 -
給字符指針分配內存
马上能想到的函数有: GetMemAllocMemReallocMemFreeMemGetMemoryReallocMemoryFreeMemoryNewDisposeNewStrDisposeStrStrNewStrAllocStrDisposeGlobalAllocPtrGlobalFreePtrW转载 2009-09-29 09:58:00 · 688 阅读 · 0 评论 -
給數組指針分配內存
静态数组, 在声明时就分配好内存了, 譬如: var arr1: array[0..255] of Char; arr2: array[0..255] of Integer;begin ShowMessageFmt(数组大小分别是: %d、%d, [SizeOf(arr1), SizeOf(arr2)]); {数组大小分别是: 512、1024}end;转载 2009-09-29 09:54:00 · 1157 阅读 · 0 评论 -
delphi内存管理
Delphi自动管理的内存 Delphi中原子变量,如Integer、Boolean、Record、枚举等都是在作用域内编译器自动申请内存,出了作用域自动释放;另外,字符串、Variant、动态数组、接口也是由Delphi自动管理。 这些变量都是在栈中存储的,除了接口。另外,Variant是程序员用函数手工创建的,例如VarArrayCreate;动态数组也是程序员用函数手工创建的,例如SetLe原创 2008-07-11 10:11:00 · 435 阅读 · 0 评论 -
指针初始化
一个全局变量可以初始化, 如果你不主动初始化, 也会被自动初始化;一个局部变量不能被初始化, 虽然你不能主动初始化, 但它会被赋予一个随机值.-------------------------------------------------------------------------------- unit Unit1;interfaceuses Windows, Messages,原创 2008-08-19 11:49:00 · 617 阅读 · 0 评论 -
有序类型的大小及最大、最小值
有序类型的大小及最大、最小值 procedure TForm1.Button1Click(Sender: TObject);var b: Byte; w: Word; i: Integer; c: Cardinal;begin ShowMessage(IntToStr(SizeOf(b))); //Byte大小:1 ShowMessage(IntToS原创 2008-08-25 14:12:00 · 425 阅读 · 0 评论 -
指针和引用的区别
指针和引用的区别:指针是野孩子引用是乖孩子野孩子的特点喜欢撒野打滚乖孩子是对野孩子进行调教了原创 2008-09-26 11:19:00 · 323 阅读 · 0 评论 -
给字符指针(PChar、PWideChar、PAnsiChar)分配内存, 最佳选择是: StrAlloc.
StrAlloc 虽然最终也是调用了 GetMem, 但 StrAlloc 会在指针前面添加 Delphi 需要的 4 个管理字节(记录长度).StrAlloc 分配的内存, 用 StrDispose 释放, 用 StrBufSize 获取大小.用 FreeMem 释放可以吗? 这样会少释放 4 个字节.这种类型的指针一般用于 API 函数的参数, 譬如获取窗口标题:--------转载 2008-11-17 10:28:00 · 950 阅读 · 0 评论 -
给数据指针分配内存
对静态数组指针, 虽然在声明之处并没有分配内存, 但这个指针应该分配多少内存是有定数的.这种情况, 我们应该用 New 和 Dispose 来分配与释放内存. 譬如: type TArr1 = array[0..255] of Char; TArr2 = array[0..255] of Integer;var arr1: ^TArr1; arr2: ^TAr转载 2008-11-17 10:33:00 · 618 阅读 · 0 评论 -
fastmm使用
首先在下载的文件里你会找到一个文件,位置在Replacement BorlndMM DLL/Precompiled/for Delphi IDE/Performance/BorlndMM.dll,替换掉Delphi/Bin下的相应文件就可以完成对IDE的提速。 对自己编的程序的提速也非常简单,只要在.dpr工程文件里的uses部分加上FastMM4就可以了,但必须是加在第一位,还要记得设置 路转载 2008-11-17 09:14:00 · 1501 阅读 · 0 评论 -
FillMemory()、ZeroMemory(),fillchar()
FillMemory、ZeroMemory 一目了然的两个函数, 但其实它们都是调用了 FillChar;清空不过就是填充空字符(#0: 编号为 0 的字符), 说来说去是一回事.为了下面的测试, 先写一个以十六进制方式查看内存的函数:-----------------------------------------------------------------------------转载 2008-11-17 10:23:00 · 2528 阅读 · 1 评论 -
move(), copymemory()
move()var buf1,buf2: array[0..9] of AnsiChar;begin buf1 := 0123456789; buf2 := abcdefghij; Move(buf2[2], buf1[4], 5); ShowMessage(buf1); {0123cdefg9} ShowMessage(buf2); {abcdefghij}end转载 2008-11-17 10:20:00 · 550 阅读 · 0 评论 -
给结构体指针分配内存
但在很多时候, 一些参数是结构指针; 特别是在接受数据时, 一般需要手动分配内存. 如果只使用一个单结构指针, 用 New 分配内存是最合适的, 譬如: var p: PPoint; {这是点结构 TPoint 的指针, 系统早定义好的}begin New(p);// p^.X := 1; p^.Y := 2; {或者写成下面这样} p.X := 1; p转载 2008-11-17 10:31:00 · 429 阅读 · 0 评论 -
移動內存塊move
var Source,Dest: string;begin Source := 123456789; Dest := ---------; Move(Source[5], Dest[3], 4); ShowMessage(Dest); {--5678---}end;转载 2009-09-18 17:10:00 · 286 阅读 · 0 评论 -
清空和填充內存
FillMemory、ZeroMemory 一目了然的两个函数, 但其实它们都是调用了 FillChar;清空不过就是填充空字符(#0: 编号为 0 的字符), 说来说去是一回事.为了下面的测试, 先写一个以十六进制方式查看内存的函数: function GetMemBytes(var X; size: Integer): string;var pb: PByte; i:转载 2009-09-29 09:39:00 · 547 阅读 · 0 评论 -
内存的三种状态
<br />自由FREE:内存页既没有提交也没有被保留。它不能被进程访问,但是可以供某个内存分配函数分配。<br /> 保留RESERVED:内存已经被调用进程保留,不能被其他进程或者线程使用。但是内存并没有被使用,也没有提交到物理存储器。<br /> 提交COMMITTED:内存已经被提交到物理存储器。内存标识为正在被使用。只有分配它的进程才可以使用该内存。原创 2010-06-16 09:17:00 · 453 阅读 · 0 评论