delphi - 编译器是否优化(关闭)相同的 FieldByName 调用?

标签 delphi optimization delphi-xe2

在我维护的一些代码中,我看到 TClientDataSet.OnCalcFields 事件处理程序中使用了两种不同的方法:

 with DataSet do
 begin
   // 1. Call FieldByName twice
   if AMinDate > FieldByName(SPlanAllocatieFromDate).AsDateTime then
      AMinDate := FieldByName(sPlanAllocatieFromDate).AsDateTime;
   // 2. Put the retrieved FieldByName value in a temp var
   lEmpID := FieldByName(SPlanAllocatieEmpID).AsInteger;
   if lEmpID <> 0 then lTSAllocatedEmpIDs.Add(IntToStr(lEmpID));
 end;

编译器(Delphi XE2、Win32 应用程序)是否会优化方法 2 以使用临时变量?这两个 FieldByName 非常接近,您甚至可以说嵌套

如果没有,我应该重写 1. 因为 OnCalcFields 经常执行。

顺便说一句。我知道 Fields[] 与 FieldByName() 的比较,或者在运行 EOF 循环时使用临时 TField var,这些不是这里的问题。

最佳答案

Delphi 编译器的任何版本都没有做这样的事情。

此类优化需要编译器能够证明对 FieldByName 的两次调用始终会给出相同的结果,并且目前没有将方法标记为确定性的规定。

请注意,理论上(如果实际上不太可能)两个调用很可能不会给出相同的结果,在这种情况下,例如如果不同的线程在第一次和第二次调用之间从集合中删除一个字段。通常,编译器不知道也不关心调用站点特定方法调用实际执行的操作。

关于delphi - 编译器是否优化(关闭)相同的 FieldByName 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24452037/

相关文章:

HTML 标签解析

delphi - 文本文件 XE2 中实数的小数分隔符

delphi - Delphi XE2中的Dcu

delphi - Delphi调试中移动程序计数器

oracle - 德尔福TDBX事务 'Invalid transaction Object'

java - Jython 优化

vba - 将工作表 1 第 1 列与工作表 2 第 1 列比较工作表 1 第 6 列中的位置值

c# - 在 C# 和 C++ 中将 float / double 乘以 0.5 而不是除以 2 是否安全?

delphi - VCL 样式 - 减小了客户端表单大小

delphi - Firemonkey (Delphi) TListbox 与 MultiSelect 获取选定项目