Delphi的對象机制浅探.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Delphi的對象机制浅探

Delphi的对象机制浅探 2004-1-3 前几天开始阅读 VCL 源代码,可是几个基类的继承代码把我看得头大。在大富翁请教了几位仁兄后,我还是对Delphi对象的创建和方法调用原理不太清楚。最后只好临时啃了一下汇编,把Delphi对象操作的几个关键的方法勘察了一遍。 你可以通过以下链接知道我为什么要做这件事: /delphibbs/dispq.asp?lid=2385681 这是我花费一个晚上的测试结果,更多的细节只能以后在学习中再去了解。 主要测试项目为: ⊙ 测试目标:查看 TObject.Create 的编译器实现 ⊙ 测试目标:查看 constructor 函数中 inherited 的编译器实现 ⊙ 测试目标:以 object reference 和 class reference 调用构造函数的编译器实现 ⊙ 测试目标:考查 Object 和 Class 在调用 class method 时的编译器实现 ⊙ 测试目标:考查 ShortString 返回值类型的函数没有赋值时编译器的实现 我把测试的细节记录在后文,一是自己留作参考,二是给对此有兴趣的朋友参考。其实更重要的是,大家可以帮忙检查我的分析有没有错误。我一直是用 Delphi 的组件拖放编程,真正的功底只是这几天阅读 Object Pascal Reference 和 VCL 得来的,汇编更是临时抱佛脚,所以错误难免。我清楚自己的水平,所以写下结论后非常担心。尽管如此,我的目的是为了学习,希望你发现错误后帮我指出来。 主要的结论是: (*) TObject.Create确实是个空函数,Borland 并没有隐藏 TObject.Create 的代码。TObject.Create的汇编代码是由 constructor directive 指示编译器形成的,编译器对每个class 都一视同仁。 (*) dl 和 eax 是 constructor Create 实现的关键寄存器。Borland 将对象的创建过程设计得精妙而清晰(个人感觉,因为我不知道其他的语言比如C++是如何实现的)。 (*) 一个对象的正常的创建(Obj := TMyClass.Create)过程是这样的: ? 1. 编译器保证第一个 constructor 调用之前 dl = 1 ? ? ?编译器保证 inherited Create ?调用之前 dl = 0 ? 2. dl = 1 时 编译器保证 Create 时 eax = pointer to class VMT ? ? ?dl = 0 时 编译器保证 Create 时 eax = pointer to current object ? 3. 编译器保证任何层次的 constructor 调用后 eax = pointer to current object ? 4. dl = 1 时 编译器保证 Create 调用 System._ClassCreate,并与 constructor 相同的方式使用 eax ? ? ?dl = 1 时 编译器保证 Create 调用 System._AfterConstruction,并且调用前后 eax = pointer to current object ? ? ?dl = 0 时 编译器保证 Create 不会调用 System._ClassCreate ? ? ?dl = 0 时 编译器保证 Create 不会调用 System._AfterConstruction ? 5. System._ClassCreate 中设置结构化异常处理,在 Create 即将结束时关闭结构化异常处理。 ? ? ?如果出错则会(1)释放由编译器分配的内存(2)恢复堆栈至创建对象之前(3)调用 TSomeClass.Destroy。 (*) object reference 方式的 constructor 调用,编译器尝试实现为 inherited 调用,结果当然是错误。 (*) class method 的调用隐含参数 eax 为指向 VMT 的指针,不管是用 class 还是 object 方式调用,编译器都会正确地把指向 class VMT 的指针传递给 eax。 要读懂下文的测试过程,可能需要相关基础,推荐阅读 Object Pascal Reference 以下章节: ?Parameter passing ?Function results ?Calling conventions (register缺省调用约定,constructor 和 destructor 函数必须采用 register 约定) ?Inline assambly code ?《Delphi的原子世界》非常值得一读

文档评论(0)

cv7c8hj6b4I + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档