[fpc-devel] sub-optimal code for UniqueString
    Martin Frb 
    lazarus at mfriebe.de
       
    Fri Oct 17 15:28:26 CEST 2025
    
    
  
Well, I know its just a function, and the compiler does not know.... (at 
least 3.2.3 / don't know if 3.3.1 is doing better).
But in the below code, uniquestring has to make a copy of s, even though 
that would not really be needed.
When "s" is assigned the result of "bar", then that result is in a 
temporary variable (which is passed by ref to bar). That temp var has a 
reference, so the ref count is 2.
(the temp string is only dec-ref-ed in the implicit finally of foo).
Because of this, UniqueString must copy s, as it has a refcnt > 1.
If the compiler could detect this, it could first dec-ref the temp 
string, then UniqueString would see the refcnt of 1, and be done.
This may apply in many other cases, like if a string gets modified and 
triggers copy on write.
It may be worth considering to dec-ref temp strings earlier?
program uniq_ref_str;
{$Mode objfpc}{$H+}
uses SysUtils;
function bar: AnsiString;
begin
   Result := IntToStr(Random(99));
end;
procedure foo;
var s: ansistring;
begin
   s := IntToStr(Random(99));
   write(s);
   s := bar;
   UniqueString(s);
   write(s);
end;
begin
   foo;
end.
    
    
More information about the fpc-devel
mailing list