在我维护的一些代码中,我看到 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/