上一页 1 ··· 166 167 168 169 170 171 172 173 174 ··· 203 下一页
摘要: 本例效果图:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;Button2: TButton;Memo1: TMemo;Memo2: TMemo;procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);end;varForm1: 阅读全文
posted @ 2010-06-17 16:43 delphi中间件 阅读(275) 评论(0) 推荐(0)
摘要: 本例在建立一个新的堆前后分别通过 GetProcessHeaps 函数获取了当前进程的堆句柄列表, 没想到一个最简单的程序也有 5 个堆. 效果图:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)Memo1: TMemo;Memo2: TMemo;Button1: TButton;procedure FormCreate(Sender: TObject);proc 阅读全文
posted @ 2010-06-17 16:41 delphi中间件 阅读(185) 评论(0) 推荐(0)
摘要: 系统给程序的地址数是 4G, 为什么不是 3G 或 5G? 因为 32 位的指针的最大值就是 $FFFFFFFF, 它不能表示更多了, 究其根源这要回到 CPU 的寻址能力、地址总线等等.在 Win64 下, 系统给程序的地址数达到了 16EB(0 - $FFFFFFFFFFFFFFFF), 也就是 18446744073709551616 个. 不过 Win64 还没有普及, 我们还得回到实际的 Win32.就这 4G 的地址, 系统还要留下一半($80000000 - $FFFFFFFF, 这 2G 是各进程共享的)用作宏观管理; 只给程序 2G(0 - $7FFFFFFF).就这 2G 阅读全文
posted @ 2010-06-17 16:36 delphi中间件 阅读(183) 评论(0) 推荐(0)
摘要: VirtualAlloc 分配的内存是以 4K 为最小单位、连续的内存地址(但映射到真实的内存时它不一定是连续的), 前面说了, 它不适合分配小内存(譬如只有几个字节的变量); 局部的变量在 "栈" 中有程序自动管理, 那么那些全局的小变量怎么办呢? 这就要用到 "堆".9 q% /+ Q1 L, }1 F2 x$ D5 D! A+ n! q4 O% aQ5 x0 r3 Y这样看来, VirtualAlloc 分配的内存既不是 "栈" 也不是 "堆"; VirtualAlloc 分配的内存地址是连续的, " 阅读全文
posted @ 2010-06-17 16:34 delphi中间件 阅读(241) 评论(0) 推荐(0)
摘要: 一个使用私有堆的例子:unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); end;var Form1: TForm1;implementation{$R *.dfm}var MyHeap: THandle; {堆句柄} p: Pointer.. 阅读全文
posted @ 2010-06-17 16:31 delphi中间件 阅读(178) 评论(0) 推荐(0)
摘要: Windows 是多任务的操作系统, 一个任务就是一个应用(应用程序)、一个应用占一个进程; 在一个进程里面, 又可以运行多个线程(所以就有了很多"多线程编程"的话题). 对 Win32 来讲, 系统给每个进程 4GB 的地址空间:低端 2GB($00000000 - $7FFFFFFF) 给用户支配;高端 2GB($80000000 - $FFFFFFFF) 留给系统使用. 文件或程序要调入内存才能工作, 先看看我们的内存到底有多大吧.在系统盘根目录下有个 pagefile.sys 文件, 这就是我们的 "虚拟内存"(虚拟内存是以文件的形式存在的). 阅读全文
posted @ 2010-06-17 16:30 delphi中间件 阅读(241) 评论(0) 推荐(0)
摘要: 象使用虚拟内存一样,使用内存映像文件同样需要经过保留和提交两个过程,首先在进程内存空间保留一块区域,然后提交物理存储给这段区域。不同的是物理存储来自于磁盘上的文件,而不是系统的分页文件。也即将磁盘上指定的数据文件作为虚拟内存,这个实现过程被称为文件映像,可以将文件全部或部分映像到进程的地址空间中。文件映像过以后,可以把文件映像的部分当作已全部被载入内存一样的去访问它,这时又称它为内存映像文件。内存映像文件使用步骤要使用内存映像文件,可以按以下步骤:(1) 调用Windows API 函数CreateFile()创建或是打开一个文件,得到一个标识该文件(内核对象)的句柄,它确定了哪一个磁盘文件将 阅读全文
posted @ 2010-06-16 21:46 delphi中间件 阅读(442) 评论(0) 推荐(0)
摘要: 在虚拟内存模型下,理论上有2GB的内存供程序使用。当VIRTUALALLOC或者其他函数提交虚拟内存时,虚拟内存管理器就开始消耗RAM。当物理内存将被消耗完时,管理器就开始将内存页面映射到硬盘。在默认的设置下,操作系统会用硬盘的所有可用空间来作为磁盘交换文件。因此,内存的限制并不是2GB的理论限制,而是RAM加上硬盘可用交换文件空间。2GB的虚拟内存空间对于进程是私有的。硬盘交换文件对于操作系统和所有正在执行的任务而言是共享资源。 阅读全文
posted @ 2010-06-16 19:02 delphi中间件 阅读(300) 评论(0) 推荐(0)
摘要: 自由FREE:内存页既没有提交也没有被保留。它不能被进程访问,但是可以供某个内存分配函数分配。 保留RESERVED:内存已经被调用进程保留,不能被其他进程或者线程使用。但是内存并没有被使用,也没有提交到物理存储器。 提交COMMITTED:内存已经被提交到物理存储器。内存标识为正在被使用。只有分配它的进程才可以使用该内存。 阅读全文
posted @ 2010-06-16 09:17 delphi中间件 阅读(278) 评论(0) 推荐(0)
摘要: 有4种用于内存分配的API函数。虚拟VIRTUAL函数用于分配和管理大数量的内存,堆函数HEAP用于小数量内存,全局函数GLOBAL及局部函数LOCAL用于小数量内存分配,这两类函数是为了实现与16位系统兼容而提供的。WIN32 API仍然维护全局以及局部的堆函数,但是它们都是从局部的2GB中分配内存。这些堆对于进程而言都是局部的,不能被其他进程访问。 当一个程序需要分配一个至少几KB缓存时,使用VIRTUALALLOC函数获得内存块。它以4KB为单位获取内存,分配的内存以4KB来对齐。当程序需要为小对象,数组或者结构分配内存时,调用HEAPALLOC函数更合适。将VIRTUALALLOC函数 阅读全文
posted @ 2010-06-16 09:11 delphi中间件 阅读(250) 评论(0) 推荐(0)
上一页 1 ··· 166 167 168 169 170 171 172 173 174 ··· 203 下一页