CnPack Forum


 
Subject: 问一个看似很平常的问题
niaoge
灌水司司长
Rank: 6Rank: 6



UID 9910
Digest Posts 0
Credits 438
Posts 143
点点分 438
Reading Access 10
Registered 2007-4-8
Status Offline
Post at 2007-7-30 11:58  Profile | Blog | P.M. 
问一个看似很平常的问题

下例两种方法有区别吗?
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;   
大家不要笑话我啊
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6838
Posts 3591
点点分 6838
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2007-7-30 15:45  Profile | Blog | P.M. 
从实现效果上来说没有区别。
从编译器生成的代码来说,可能有点区别。后者使用了堆栈中的局部变量,而前者可能只使用某个寄存器。
Top
stanleyxu2005
新警察
Rank: 1



UID 5617
Digest Posts 1
Credits 45
Posts 15
点点分 45
Reading Access 10
Registered 2007-2-11
Status Offline
Post at 2007-7-31 17:09  Profile | Site | Blog | P.M. 
第一种方法比较干净,而且生成的代码更简洁




http://getgosurf.com/forum/
Top
Rainstorey
普通灌水员
Rank: 2
菜鸟


UID 977
Digest Posts 0
Credits 82
Posts 39
点点分 82
Reading Access 10
Registered 2005-8-8
Location 苏州
Status Offline
Post at 2007-7-31 17:21  Profile | Blog | P.M. 
第一种方法构建的是临时对象,放在CPU寄存器中接下来对类的成员访问都是通过寄存器直接寻址所以速度比较快.缺点是出了With的作用域寄存器恢复上下问你也就失去了对类的访问能力.
第二种方法是把类的引用地址存入栈变量(类的实体内容是存放在堆中),这样通过变量来访问类成员.速度比起第一种通常要要慢一些.(内存访问,不排除被编译器优化).好处是访问类的能力即为该变量的存活期.




Top
zzzl (早安的空气)
版主
Rank: 7Rank: 7Rank: 7



UID 590
Digest Posts 0
Credits 399
Posts 199
点点分 399
Reading Access 100
Registered 2004-11-29
Status Offline
Post at 2007-8-2 08:45  Profile | Blog | P.M.  | QQ
区别就是看起来不一样
Top
 




All times are GMT++8, the time now is 2024-11-24 14:34

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.0.0  © 2001-2006 Comsenz Inc.
Processed in 0.009593 second(s), 7 queries , Gzip enabled

Clear Cookies - Contact Us - CnPack Website - Archiver - WAP