[fpc-pascal] Stack alias for ARC like memory management?

Ryan Joseph ryan at thealchemistguild.com
Wed Apr 25 10:21:32 CEST 2018



> On Apr 25, 2018, at 12:59 PM, Sven Barth via fpc-pascal <fpc-pascal at lists.freepascal.org> wrote:
> 
> The memory model of classes in Object Pascal is heap based. Changing that is asking for trouble and I for one don't even want to fiddle around with that, because I don't see any real benefit in it (and yes I daily work with C++) that couldn't also be solved with a working ARC system. 
> 

Just for fun here’s that same code from the previous post but with the keyword added. :) It’s really a good example because this is the same thing we do over and over again every day so it’s a perfect candidate for a simple compiler optimization. We save a block of code, not forgetting to call free and 2 pointers from GemMem that wasted CPU and got us closer to a fragmented heap.

It’s minor but it’s saves minor amounts of time and CPU cycles, both of which really add up over the lifetime of a program.

The programer in this case knows with 100% certainty they don’t need 2 pointers from GetMem but Pascal forces us anyways, and then makes us clean up the mess we didn’t need to make in the first place.

PS. I’m aware those 2 functions may actually raise exceptions but pretend they didn’t and this was just common memory management we do every day.

new code:

function TBlowFishCripto.Encrypt(const Value: string): string;
var
  en: TBlowFishEncryptStream; stackalias;
  stream: TStringStream; stackalias;
begin
  if length(Value) = 0 then
  begin
    Result := '';
    Exit;
  end;
  stream := TStringStream.Create('');
  en := TBlowFishEncryptStream.Create(FKey, stream);
  en.Write(Value[1], Length(Value));
  Result := stream.DataString;
end;  

original code:

function TBlowFishCripto.Encrypt(const Value: string): string;
var
  en: TBlowFishEncryptStream;
  stream: TStringStream;
begin
  if length(Value) = 0 then
  begin
    Result := '';
    Exit;
  end;
  try
    stream := TStringStream.Create('');
    en := TBlowFishEncryptStream.Create(FKey, stream);
    en.Write(Value[1], Length(Value));
    Result := stream.DataString;
  finally
    FreeAndNil(en);
    FreeAndNil(stream);
  end;
end;  

Regards,
	Ryan Joseph




More information about the fpc-pascal mailing list