[fpc-pascal] How to avoid Copy

Amir at Aavani.net Amir at Aavani.net
Sat Dec 30 05:34:51 CET 2023


Hi all,

  I have a List of record, where the record has a WideString field.
   I have some code like the following:

function check(constref v: TMyRecord; data: TListOfMyRecord): Boolean;
var
   r: TMyRecord;

begin
   Result := False;
   for r in data do
     if r.State = v.State then
       Exit(True);
end;

I call this method a lot and the CPU profiling shows a lot of cpu time 
spent on "fpc_copy_proc" (which I assume is doing the deep copy on 
records) from "TCustomListEnumerator.GetCurrent".
I considered other alternatives like using enumerators but they all need 
a to return a record (and hence copying the widestring field).
I can think of two solutions to get rid of the wasting(!) so much time 
on "fpc_copy_proc":
1) Changing the TMyRecord to TMyClass. But then I need to Create and 
Free a "lot" of objects.
2) Update TListOfMyRecord to TListOfPointerToMyRecord. This requires a 
"lot" of memory allocation/fragmentation.

Is there a better solution?

Best,
Amir


More information about the fpc-pascal mailing list