Board logo

Subject: 问一个看似很平常的问题 [Print This Page]

Author: niaoge    Time: 2007-7-30 11:58     Subject: 问一个看似很平常的问题

下例两种方法有区别吗?
1.
begin
with TXXObject.create() do
  try
     ......
  finally
    Free
  end;
end

2.
var
  XXX:TXXObject
begin
  XXX:=TXXObject.create()
with XXX do
  try
     ......
  finally
    FreeAndNil(XXX);
  end;   
大家不要笑话我啊
Author: Passion    Time: 2007-7-30 15:45

从实现效果上来说没有区别。
从编译器生成的代码来说,可能有点区别。后者使用了堆栈中的局部变量,而前者可能只使用某个寄存器。
Author: stanleyxu2005    Time: 2007-7-31 17:09

第一种方法比较干净,而且生成的代码更简洁
Author: Rainstorey    Time: 2007-7-31 17:21

第一种方法构建的是临时对象,放在CPU寄存器中接下来对类的成员访问都是通过寄存器直接寻址所以速度比较快.缺点是出了With的作用域寄存器恢复上下问你也就失去了对类的访问能力.
第二种方法是把类的引用地址存入栈变量(类的实体内容是存放在堆中),这样通过变量来访问类成员.速度比起第一种通常要要慢一些.(内存访问,不排除被编译器优化).好处是访问类的能力即为该变量的存活期.
Author: zzzl    Time: 2007-8-2 08:45

区别就是看起来不一样




Welcome to CnPack Forum (http://bbs.cnpack.org/) Powered by Discuz! 5.0.0