[fpc-pascal] Re: operator overloading and counting references / creating / destoying anonymous instances

Flávio Etrusco flavio.etrusco at gmail.com
Thu Jul 28 21:45:54 CEST 2011


On Thu, Jul 28, 2011 at 1:59 PM, Bernd <prof7bit at googlemail.com> wrote:
> 2011/7/28 Bernd <prof7bit at googlemail.com>:
>> I have tried making
>> use of Interface and TInterfacedObject and this seems to do what I
>> want: for example when witing A := A + B the + operator would return a
>> new instance and the reference counting would then automatically call
>> the destructor of A when it assigns the newly created number.
>
> I have profiled it
> http://imagebin.org/165317
>
> procedure Loop(a,b: IFoo);
> var
>  I : Integer;
> begin
>  for i := 0 to 10000 do begin
>    //BN_mul(b.Handle, a.Handle, a.Handle, b.Context);
>    b := a * a;
>  end;
> end;
>
> This creates and destroys an object of TFoo everytime and this in turn
> will also create and free resources inside OpenSSL, its only spending
> 37% of the time doing actually useful work (BN_mul).
>
> I think I'm not going to continue this route. I can't see any possible
> way to make useful use of overloading these operators, other than
> making a few lines in other places of the code look a little bit nicer
> at the cost of degrading performance by a factor of 3 (for add instead
> of mul its even factor 6).
>
> Occasionally I hear other people mentioning operator overloading as a
> must-have feature of any decent language but I wonder what real-world
> problems they are actually solving with it. Are other compilers better
> at dealing with these problems, is there room for improvement?
>
> Bernd

Implement += and *= operator to avoid allocating new objects?
You could also/instead override  TObject.NewInstance and FreeInstance
to implement a pool of objects.

-Flávio



More information about the fpc-pascal mailing list