Am 23.02.2012 10:05, schrieb Tommi Prami:
 >

> Incl. Self. Called Function
> 29.78 29.72 26M SYSTEM_FILLCHAR$formal$INT64$BYTE
> 19.07 19.07 123M SYSTEM_MOVE$formal$formal$INT64
> 3.63 3.63 70M SYSTEM_SYSGETMEM_FIXED$QWORD$$POINTER
> ....
>
> The main caller of FillChar function is
> system_TObject_$__NewInstance$$TObject which called Fillchar 26 Million
> times.
>
> NewInstance method in TObject calls InitInstance which is an inline
> function and defined as follows:
>
> class function TObject.InitInstance(instance : pointer) :
> tobject; {$ifdef SYSTEMINLINE} inline; {$ENDIF}
>
> begin
> { the size is saved at offset 0 }
> fillchar(instance^, InstanceSize, 0);
> { insert VMT pointer into the new created memory area }
> { (in class methods self contains the VMT!) }
> ppointer(instance)^:=pointer(self);
> if PVmt(self)^.vIntfTable <> @emptyintf then
> InitInterfacePointers(self,instance);
> InitInstance:=TObject(Instance);
> end;
>
> My question is do we need to call fillchar in InitInstance? Or Is there
> any way to avoid calling InitInstance?

Yes, FillChar is needed, because a class instance is guaranteed to
have Bennett initialized with zero before the first constructor is
called (this way the fields are basically initialized by 0, Nil or ''
depending on the field type).



But still...

Any improvement done in the Creating and Freeing an Objects would be
welcome :)

We need the FillChar there, but if the object creation could be
optimized even a little bit, it would benefit almost all the code. Some
more than others... But still...

In August 2010 Florian already said that maybe FillChar should be optimized: http://lists.freepascal.org/lists/fpc-devel/2010-July/021146.html (at the bottom)

Regards,
Sven

_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to