我一直在看system.pas Delphi可以从Windows调用多达65,000个内存块 当Delphi制作一个物体剂量时,它会为其数据调用一个内存块 如果是这样的话,那么如何为一个寄存器加载具有该存储器块的存储器地址的寄存器以及放置在另一个寄存器中的方法的地址。 有没有人对此有所了解?
使用GetMem,您可以从Windows调用一个内存块,Windows在4 Gig空间内为每个进程分配最多65,000个内存块。取决于fag取决于在调整大小时是否移动块,并且调整大小或已修复的数据以及其他问题。 阅读Windows或转到windows.pas并搜索内存并调用Delphi帮助 对于system.pas like1 / _ObjectProcess来说,Thier是很多有趣的东西,好像要给delphi程序员添加麻烦。为什么他们不只是把代码放在TObject中。 2 /代码如何测量对象的缩小大小。
答案 0 :(得分:4)
看看这个关于Delphi创建新类实例时发生了什么的优秀解释:The Rise and Fall of TObject from Hallvard Vassbotn 尽管原始文章出现在1998年,但大多数文章仍适用于较新的Delphi版本。 以下是“德尔福杂志”的原始文章:The Delphi Magazine, July 1998
答案 1 :(得分:1)
你的“65000内存块”统计来自哪里?
当一个类实例被创建时,在执行类的Create
方法之前调用以下类方法(来自_ClassCreate
全局函数,这确保实例只创建一次,对于所有创建嵌套调用):
class function TObject.NewInstance: TObject;
调用GetMem
从堆中获取内存,然后使用以下方法:
class function TObject.InitInstance(Instance: Pointer): TObject;
此InitInstance
方法将:
方法(即不是接口)是在类类型本身中定义的,而不是在类实例创建期间定义的。
没有包含您所说内容的“注册”。
您可以通过自身变量访问对象内存地址,或者将其变量转换为指针:
var O: TObject;
begin
O := TObject.Create;
writeln('O memory address is ',pointer(O));
O.Free;
end;
在Delphi 2010及其增强版RTTI之前,您无权访问对象的所有方法和字段。您的代码只能访问已发布的属性和方法。但是你必须使用RTTI。请参阅TypInfo.pas单元。