发信人: 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]
|
|