发信人: skyice() 
整理人: skyice(2000-06-22 00:28:37), 站内信件
 | 
 
 
分配内存页
   你可以使用 VirtualAloc() 分两步或一步来分配内存页。分两步的
 方法是首先预留内存,然后把内存提交到页。下面是一个按两步的方法分
 配内存的例子:
   // Reserve a 64K range of addresses.
   LPVOlD p=VirtualAlloc(0,0x10000,MEM_RESERVE,PAGE_READWRITE);
   if(p==NULL)
     {
       /* Error. */
   }
   // Commit a 4K range of addresses.
   LPVOID pTemp=VirtualIAlloc(p,0X1000,MEM_COMMIT,
   PAGE_READWRITE);
   if(pTenp==NULL)
    {
       /* Error. */
   }
   对 VirtualAlloc() 的第一次调用预留了一个 64K 的地址区段,并
 定位在操作系统选定的位置处。第二次调用把 4K 预留地址提交到一个内
 存页。注意,这个代码片段怎样分别为每次调用保存返回值。因为页和区
 段有不同的间隔尺寸,又由于每个调用都有失败的可能性,所以必须把每
 种调用看成分离的、独立的内存分配行为。
   一步方式是用 MEM_COMMIT 标志调用 VirtualAlloc()。换句话说,
 在得到页前不预留地址,而是把预留和提交请求合并进一个调用:
   // Commit a 4K range of addresses.
   LPVOID pTemp=VirtualIAlloc(0,0X1000,MEM_COMMIT,
   PAGE_READWRITE);
   if(pTenp==NULL)
     {
       /* Error. */
   }
   要收回前面提交的页,或者放弃前面预留的地址范围,要调用 Virt-
 ualFree()。用 MEM_DECOMMIT 标志调用这个函数时,页被收回(但是地
 址范围仍然预留着)。要放弃一定范围的预留信息,可以用 MEM_RELEASE
 标志调用 VirtualFree()。
   Win32 虚拟内存函数的完整集合在下表中进行了总结。大多数函数很直
 观,不需要更多的解释,只要看一看 Win32 帮助数据库或文档中的 Win32
 函数名就会明白。为 Win32 进程直接分配的最后一组私有页是用于堆栈的
 页。下面将继续讨论。
 
                控制进程页分配的函数
 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   函数                说明
 ——————————————————————————─—————
   VirtualAlloc()      预留一个地址范围和/或分配内存页
 ———————————————————————————————─
   VirtualFree()       收回预留的地址范围和/或释放已分配内存的页
 ———————————————————————————————─
                       为核心工作进程组添加一组页。尽管页可被写
   VirtualLock()       入页文件,但是一旦该进程中的线程被调度运
                       行,它们就将被读回内存。
 ———————————————————————————————─
   VirtualProtect()    改变当前进程中一组已提交页上的访问保护。
 ———————————————————————————————─
   VirtualProtectEx()  在调用者有足够访问权的系统中,改变任何进
                       程中一组已提交页上的访问保护。
 ———————————————————————————————─
   VirtualQuery()      返回当前进程中具体地址处的虚拟内存细节。
 ———————————————————————————————─
   VirtualQueryEx()    在调用者有足够访问权的系统中,返回任何进
                       程中具体地址处的虚拟内存细节。
 ———————————————————————————————─
   VirtualUnlock()     从核心工作进程组中删除一组页,因此当进程
                       中的线程运行时,它并不一定非要在内存中;
 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 
 分配栈空间
   栈是编译器用于短期内存需求的临时内存区。栈中容纳着四种类型的
 数据:函数的局部变量、函数被调用时传人的参数、寄存器值和返回地址。
 栈的的使用就象动态的时涨时落的潮水。
   也许关于栈的最重要问题就是栈的大小。在 Windows 98 和 Windows
 NT 上,Win32 线程默认的栈大小为1MB。对于在 Win32s 下运行的 Win32
 程序,可用的栈更小一些:只有 128K。如果你编写一个使用了许多局部变
 量或用了许多递归的 Win32 程序,应当在 Win32s 上测试你的应用程序,
 以确保没有超越可用的栈空间。
  -- 我想我是海,宁静的深海
 不是谁都明白 ...
  ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.99.91.3]
  | 
 
 
 |