关于 Var 和 Result!!

lynchhei 2014-07-21 02:02:29
procedure proA(var A: Integer);
begin
Inc(A);
end;

function proB(A: Integer): Integer;
begin
Result := Inc(A);
end;

求问哪个函数效率要高那么一点点?
...全文
231 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
明空皓月 2014-07-25
  • 打赏
  • 举报
回复
第一种直接操作A得到结果,第二种要重新开辟内存并复制一份数据操作,效率肯定不如第一种。 二楼挺详细的
武稀松 2014-07-21
  • 打赏
  • 举报
回复
procedure proA(var A: Integer); begin Inc(A); end; function proB(A: Integer): Integer; begin Inc(a); Result := A; end; 第一个效率要高一点点,第二个函数一开始的的begin会被编译到如下结果 产生一个integer类型的局部变量,然后把非var,const,out的参数的内容传给局部变量. 以后使用的A实际上是这个局部变量.除非你的A声明成var 然后还要再把A复制到返回值中. 也就是多了两次复制动作. 你这个例子效率差得还不太明显 如果你的A是比较大的数据结构,比如结构体效率差别更明显 比如 procedure proA(var A: TImageDosHeader); begin inc(a.e_cblp); end; 产生的代码 inc(a.e_cblp); 005D7338 66FF4002 inc word ptr [eax+$02] Unit4.pas.28: end; 005D733C C3 ret function proB(A: TImageDosHeader): TImageDosHeader; begin inc(a.e_cblp); Result := A; end; 产生的代码 005D7340 56 push esi 005D7341 57 push edi 005D7342 83C4C0 add esp,-$40 //开辟64个字节的局部变量 005D7345 8BF0 mov esi,eax 005D7347 8D3C24 lea edi,[esp] 005D734A B910000000 mov ecx,$00000010 //告诉ecx,复制次数 005D734F F3A5 rep movsd //重复复制ecx($10)次,每次复制4个字节,也就是64个字节,把参数复制到局部变量 Unit4.pas.32: inc(a.e_cblp); 005D7351 66FF442402 inc word ptr [esp+$02] Unit4.pas.33: Result := A; 005D7356 8BFA mov edi,edx 005D7358 8BF4 mov esi,esp 005D735A B910000000 mov ecx,$00000010 //告诉ecx,复制次数 005D735F F3A5 rep movsd //重复复制ecx($10)次,每次复制4个字节,也就是64个字节,把局部变量复制到返回值 Unit4.pas.34: end; 005D7361 83C440 add esp,$40 005D7364 5F pop edi 005D7365 5E pop esi 005D7366 C3 ret
luxuewei5214 2014-07-21
  • 打赏
  • 举报
回复
我自己用后面一种多些,除非返回值有多个才用前面的方法,效率的话,说不上来谁好谁坏

16,749

社区成员

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

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