[fpc-pascal] Question about System.Move()

Benito van der Zander benito at benibela.de
Mon Jan 11 15:26:12 CET 2021


Hi,

perhaps a  safe, generic function for this copying could be added to the 
RTL. Like:

Procedure ManagedMove<T>(const source: T;var dest: T;count: SizeInt);


a) For non-managed types it would be the same as Move(source, dest, 
count*sizeof(T))

b) For reference counted types (like strings or interfaces or records of 
them), it would do:

1. finalize dest
2. normal Move
3. clear source, with fillchar

(for ranges where source and dest overlap, it should skip 1 and 3 for 
the overlapping elements. Like when you shift some elements in an arrays 
by two elements to the left, it only has to finalize the two overridden 
elements before the shifted elements, and clear the last two shifted 
elements. There is only one way to do that keeps the reference counts valid)

c) For user-defined managed, not reference counted types, it would just do

       for i := 0 to count - 1 do dest[i] := source[i]

Because you really want to use Move for strings, it can be vastly faster 
than updating the refcounts. But it might not work with user-defined 
types, like someone could build a managed type that cannot be moved. E.g.:

  type TA = record
   class operator Initialize(var a: TA);
   procedure dosomething;
end;

var globalPointer: ^TA;
class operator TA.Initialize(var a: TA);
begin
   globalPointer := @a;
end;
procedure TA.dosomething;
begin
   assert(globalPointer = @self)
end;




And when you use IsManagedType, it does not distinguish standard strings 
with such weird managed types.

And perhaps there could be a special attribute to mark which kind of 
moving is needed, e.g..

   type [moveable] TA = record
   type [referencecounted] TA = record
   type [nonmoveable] TA = record

Bye,
Benito
On 09.01.21 16:28, Bart via fpc-pascal wrote:
> Hi,
>
> This may be a silly question.
> I use System.Move() to move items in a dynamic array, like
>    Move(FData[0], FData[OldEnd], FStart*SizeOf(T));
> Where T is the type of the elements in the array.
> This seems to work as expected.
>
> I have some questions though:
>
> 1. Does this depend on the alignment of the array?
> 2. Is it OK if the elements of the array are (or contain) managed types?
> 3. Are there caveats if T is a specialization of a generic type definition?
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20210111/693920bc/attachment.htm>


More information about the fpc-pascal mailing list