GetMem与GlobalAllocMemPtr在分配内存的性能有什么主要区别?(200分)

  • 主题发起人 主题发起人 millzhou
  • 开始时间 开始时间
M

millzhou

Unregistered / Unconfirmed
GUEST, unregistred user!
GlobalAllocMemPtr调用了Win API GlobalAllocMem 与 GlobalLock

有谁知道它与GetMem有什么性能上的区别?
 
Win16/32都有很详细的说明。全局堆的分配问题。

全局锁定可以在程序之间(如DLL-应用程序)传递数据;
当然如果你用在单个程序内部,就有点小题大作了。

GetMem() 是一般内存分配请求。大致相当于Alloc().

procedure _GetMem;
asm
TEST EAX,EAX
JE @@1
CALL MemoryManager.GetMem
OR EAX,EAX
JE @@2
@@1: RET
@@2: MOV AL,reOutOfMemory
JMP Error
end;

//MemoryManager是什么东西,我还没找到。所以不知道
//确切的是哪个调用。
 
memorymanager 是delphi的内存管理器,可以用setmemorymanager来加载自己的内存管理
器,delphi的sharemem单元就加载了新的内存管理器
 
谢谢两位的指点,希望大家能讨论得更深入一些
为什么TList用GetMem,而TMemoryStream要用GlobalAllocPtr?
这个问题很值得搞清楚,谢谢大家的支持。

有时用GetMem申请内存分配时会失败,OutOfMemory,仅仅申请几M,而物理内存为128M

windows不是会自动调整内存吗,应该能够为前台进程提供足够的物理内存,为何会出现
这种周转不灵的问题?
 
TList是一个指针列表,它只分配一个指针Pointer;
关于TMemoryStream,Delphi在线帮助说明:
TMemoryStream is a stream that stores its data in dynamic memory.

Unit

classes

Description

Use TMemoryStream to store data in a dynamic memory buffer that is enhanced with file-like access capabilities. TMemoryStream provides the general I/O capabilities of a stream object while introducing methods and properties to manage a dynamic memory buffer.
--------------------------------------------------------------------------------------------------------------
Memory streams are useful as intermediary objects that can hold information as well as read it from or write it to another storage medium. They provide a useful format for comparing the contents of streams, or for manipulating data that is stored in a less accessible medium.

在我划出说明里已经说明:TMemoryStream 是作为类似于文件类型分配内存的。
在WIN32 中,所有的进程空间是独立的,但文件句柄却是全局的(可以在WIN32
相关文档中找到说明)。也就是说,你在程序内部分配的内存不能在另一个程序
中使用;而在一个程序中分配的文件句柄,却可以安全地传递到另一个进程。

关于文件的全局分配内容如果需要详细资料,可以发件给我:ddev@china.com.
 
多人接受答案了。
 
后退
顶部