<p>Am 23.02.2012 08:47 schrieb "Amir" <<a href="mailto:amir@aavani.net">amir@aavani.net</a>>:<br>
><br>
> Hi,<br>
><br>
>   I have a code, developed in object pascal, with many classes. The<br>
> project is working fine.<br>
>   Today, I used callgrind (valgrind --tool=calgrind) to see which<br>
> function consumes the most execution time and I noticed that the most of<br>
> time in my project is consumed by fillchar function.<br>
><br>
> Incl.   Self.   Called     Function<br>
> 29.78   29.72    26M        SYSTEM_FILLCHAR$formal$INT64$BYTE<br>
> 19.07   19.07    123M       SYSTEM_MOVE$formal$formal$INT64<br>
>  3.63    3.63    70M       SYSTEM_SYSGETMEM_FIXED$QWORD$$POINTER<br>
> ....<br>
><br>
> The main caller of FillChar function is<br>
> system_TObject_$__NewInstance$$TObject which called Fillchar 26 Million<br>
> times.<br>
><br>
> NewInstance method in TObject calls InitInstance which is an inline<br>
> function and defined as follows:<br>
><br>
>       class function TObject.InitInstance(instance : pointer) :<br>
> tobject; {$ifdef SYSTEMINLINE} inline; {$ENDIF}<br>
><br>
>         begin<br>
>            { the size is saved at offset 0 }<br>
>            fillchar(instance^, InstanceSize, 0);<br>
>            { insert VMT pointer into the new created memory area }<br>
>            { (in class methods self contains the VMT!)           }<br>
>            ppointer(instance)^:=pointer(self);<br>
>            if PVmt(self)^.vIntfTable <> @emptyintf then<br>
>              InitInterfacePointers(self,instance);<br>
>            InitInstance:=TObject(Instance);<br>
>         end;<br>
><br>
> My question is do we need to call fillchar in InitInstance? Or Is there<br>
> any way to avoid calling InitInstance?</p>
<p>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).</p>

<p>Regards,<br>
Sven<br>
</p>