delphi – New和Dispose在内部做什么?
我想知道在调用New和Disposed时内部会发生什么. Delphi的帮助提供了一个合理的解释,但是如果一个人会写一个自己的New和Dispose,那该怎么办呢?哪个方法在内部调用两个方法还是全部组装?
我不打算写自己的New和Dispose.我对这两种方法的内部工作非常好奇. 解决方法
新的做法如下:
>通过调用GetMem为新对象分配内存. Dispose颠倒了这个: >完成托管字段. 请注意,New和Dispose都是intrinsic functions.这意味着编译器对它们有额外的了解,并且能够根据所讨论的类型改变它们的实现方式. 例如,如果类型没有托管字段,则New优化为对GetMem的简单调用.如果类型具有托管字段,则通过调用System._New实现New,该System执行上述步骤. Dispose的实现大致相同.对非托管类型的FreeMem简单调用,以及对System._Dispose的调用. 现在,System._New实现如下: function _New(Size: NativeInt; TypeInfo: Pointer): Pointer; begin GetMem(Result,Size); if Result <> nil then _Initialize(Result,TypeInfo); end; 请注意,为了简单起见,我刚刚展示了PUREPASCAL变体.对GetMem的调用很简单.对System._Initialize的调用涉及更多.它使用TypeInfo参数来查找对象中包含的所有托管类型并初始化它们.这是一个递归过程,因为,例如,记录可能包含本身是结构类型的成员.您可以在RTL源中查看所有血腥细节. 至于System._Dispose,它调用System._Finalize然后调用FreeMem. System._Finalize与System._Initialize非常相似,只是它最终确定了托管类型而不是初始化它们. 对于性能敏感的Delphi用户来说,长期以来一直是运行类型信息之上的System._Initialize和System._Finalize以这种方式实现的.这些类型在编译时是已知的,编译器可以编写为内联初始化和最终化,这将导致更好的性能. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |