初学delphi,学习这个调用虚拟内存的函数virtualalloc(),搞了我3个小时都没有搞出来?请大家进来看看,谢谢!

SailorK 2003-12-07 09:27:41
题目如下:编写一个程序,使用vitualalloc在虚存中建立一个矩阵,在输入数据时根据需要动态提交物理内存,程序结束后释放所用的虚存块。
我已经把题目搞清了,但是是初学,很多东西还把握不好,希望前辈帮忙看看,写写,谢谢!!!我真的很想把它搞好,谢了!!分不够再加
...全文
221 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
SailorK 2003-12-10
  • 打赏
  • 举报
回复
有点看不懂诶
hongqi162 2003-12-08
  • 打赏
  • 举报
回复
在Delphi中该函数VirtualAlloc用来保留虚拟页。实现在调用线程的虚地址空间中保留或提交一个页区域。
如果你不使用VirtualLock就不会把过程地址空间中的指定区域封锁在内存中。被保存的内存其它应用程序
无法使用并不是绝对的,利用VirtualFree就可以释放或收回该空间。你可以通过指针读取修改其中的内容。
//使用VirtualAlloc可以保存一定的内存,但是这和分配又有什么本质的区别呢?
没有区别,起码我是这么认为,虚存的分配本就是通过VirtualAlloc函数来完成。一段虚拟内存在申请后并
不能马上使用,如果要使用必须先提交,并且在提交时指定内存的保护方式。
//实际分配的过程则会慢一些
至于速度问题确实存在,进行分配操作往往会造成速度的减慢,例如没有空闲块。或者频繁的分配和重分配
都会造成速度减慢。但最关键在于竞争问题,如当两个或多个线程同时访问数据,而且在一个线程继续进行之
前必须等待另一个线程完成时就发生竞争。当大量使用内存块或DLL以多线程方式运行时将导致速度减慢。
竞争是在分配和释放操作中产生导致速度减慢的问题,在多任务中很难十全十美的解决!

Delphi中例子:
const
BlockCode: array [1..2] of Byte = ($59, $E9);
PageSize = 4096;
var
Block: PInstanceBlock;
Instance: PObjectInstance;
begin
if InstFreeList = nil then
begin
Block := VirtualAlloc (nil, PageSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
Block^.Next := InstBlockList;
Move(BlockCode, Block^.Code, SizeOf(BlockCode));
Block^.WndProcPtr := Pointer(CalcJmpOffset(@Block^.Code[2], @StdHookProc));
Instance := @Block^.Instances;
repeat
Instance^.Code := $E8;
Instance^.Offset := CalcJmpOffset(Instance, @Block^.Code);
Instance^.Next := InstFreeList;
InstFreeList := Instance;
Inc(Longint(Instance), SizeOf(TObjectInstance));
until Longint(Instance) - Longint(Block) >= SizeOf(TInstanceBlock);
InstBlockList := Block
end;
Result := InstFreeList;
Instance := InstFreeList;
InstFreeList := Instance^.Next;
Instance^.Method := Method
end;
qgj99 2003-12-08
  • 打赏
  • 举报
回复
SailorK 2003-12-08
  • 打赏
  • 举报
回复
大家帮忙解决一下,其实不难,只是我对delphi中的变量不是很熟
wjpop3 2003-12-08
  • 打赏
  • 举报
回复
学习!!!!!!
我顶
我顶
我顶
我顶
我顶
我顶
SailorK 2003-12-07
  • 打赏
  • 举报
回复
在线等待,谢谢

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧