【编译器优化】且看对象空指针调用对象方法

rainychan2009 2012-05-16 06:34:32

unit main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TSimpleTest = class
private
public
procedure PrintClassName;
function DoubleValue(AValue: Double): Double;
end;

TForm1 = class(TForm)
btn1: TButton;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
var
SimpleTest: TSimpleTest;
i: Double;
begin
//这里置为nil
SimpleTest := nil;
SimpleTest.PrintClassName;
i := 5;
i := SimpleTest.DoubleValue(I);
ShowMessage(FloatToStr(I));
if not Assigned(SimpleTest) then
ShowMessage('Object is nil!');
end;

{ TSimpleTest }

function TSimpleTest.DoubleValue(AValue: Double): Double;
begin
Result := AValue * 2;
end;

procedure TSimpleTest.PrintClassName;
begin
//这里必须用类方法,否则就报错
ShowMessage(TSimpleTest.ClassName);
end;

end.


各位,上面对象的指针是空的,但是我依然可以调用对象的方法。方法的规律是没有用到对象的数据部分,其实可以写成类方法,但是这里却没有加class标志,但是又可以调用。为什么可以调用呢?我怀疑是被编译器优化了,其实是按照类方法来处理的。这些方法本来就用VMT来管理的。
...全文
74 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
kaikai_kk 2012-05-17
  • 打赏
  • 举报
回复
我打的李维怎么变成利瓦伊了???
kaikai_kk 2012-05-17
  • 打赏
  • 举报
回复
不是编译器优化,实际上调用的是类的方法
这个问题很深奥,也很抽象,很难在这解释清楚
LZ可以找找利瓦伊的书来看一下,好像有一本叫什么深入核心VCL架构剖析,多看几遍
亮剑_ 2012-05-17
  • 打赏
  • 举报
回复
没有创建实例而直接使用类的方法
研究研究挺有意思,实践中建议还是不这样用,不太严谨
rainychan2009 2012-05-17
  • 打赏
  • 举报
回复
这个问题搞清楚了,我就结贴,为什么搞了两个相同的帖子?我也不知道,估计是网络的原因,提交了两遍?
rainychan2009 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
不是编译器优化,实际上调用的是类的方法
这个问题很深奥,也很抽象,很难在这解释清楚
LZ可以找找利瓦伊的书来看一下,好像有一本叫什么深入核心VCL架构剖析,多看几遍
[/Quote]
我觉得是类似类方法,但是不应该是类方法。InsideVCL只看了一遍,这些天准备再看一遍,这书真的是一本好书!我总觉得这东西的解释为:一个类定义完成,编译的时候,在VMT中,方法的地址已经确定了,一个为nil的类变量调用方法的时候,直接去VMT中找到方法的地址?不用考虑对象指针是否为空?这个部分也不算是优化,或许就是这么来的,只要某个方法不涉及类数据。
rainychan2009 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
没有创建实例而直接使用类的方法
研究研究挺有意思,实践中建议还是不这样用,不太严谨
[/Quote]
这个不是我发现的,是我的一个同事草草写了东西,忘记了创建,竟然不报错,然后我想看看究竟
s11ss 2012-05-17
  • 打赏
  • 举报
回复
另一个帖子内容一样,这个帖子就结了吧,鉴于这个绝佳的建议,分要全给我!!!

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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