[Lazarus] Questions about SetLength

Mattias Gaertner nc-gaertnma at netcologne.de
Sat Sep 13 00:38:59 CEST 2014


On Fri, 12 Sep 2014 19:21:45 +0200
payl <payl at wp.pl> wrote:

>[...]
> > Is there a penalty for calling SetLength if array already has the length  
> > we need?
> Yes, there's always penalty for operations that you don't need. FPC will  
> generate normal call, pass arguments, etc. I checked if SetLength with  
> ansistring detects that requested size is same: It doesn't, it performs  
> whole allocation and moving.

Not always.
Keep in mind that dynamic arrays have references and the array
memory itself is a reference counted structure.

SetLength creates a unique copy of the array, that means an array with
reference count 1. If it is already unique nothing is changed.
For example:

var
  A,B: array of string;
begin
  SetLength(A,10); // this allocates, A points to unique array
  A[0]:='bla'; // the A array is still unique
  SetLength(A,10); // no reallocation
  B:=A; // reference count increased to 2, not unique anymore
  SetLength(A,10); // reallocation to create a second array, now A
                   // and B point to two unique arrays
  SetLength(A,10); // no reallocation
  SetLength(B,10); // no reallocation
end;


Mattias




More information about the Lazarus mailing list