<div dir="ltr"><div dir="ltr"><div dir="ltr">TSize and TPoint, the other two advanced records defined there, have (well, mostly, they're also missing a couple) all record parameters in their method signatures declared "const", for what is presumably performance / efficiency reasons.<div><br></div><div>That is to say, record parameters specified without "var", "const", or "constref" have copies made of them 100% of the time regardless of any optimization settings, which results in quite a bit more assembly code being generated and of course slower runtime performance.</div><div><br></div><div>TRect on the other hand has literally no "const" of any kind for anything except the array called Points in one of the Union method overloads.</div><div><br></div><div>It seems to me like the original author of this unit probably *intended* to "constify" the methods for TRec the same way they did for TSize and TPoint, but just never got around to it / forgot / something along those lines.</div><div><br></div><div>I did a little test wherein I extracted the interface and implementation for TRect into a standalone unit, and compared the size of the generated assembly file both as-is and with "const" added in what I believe are the appropriate places.</div><div><br></div><div>Compiled with native Win64 trunk FPC at -O3, the no-const version was 28KB, while the version with const was 23KB, confirming my expectation that objectively slower / longer assembly is generated without const.</div><div><br></div><div>As an example, here's the no-const assembly for the "equal" operator overload:</div><div><br></div><div><div>.section .text.n_unit1$_$tmyrect_$__$$_equal$tmyrect$tmyrect$$boolean,"x"</div><div><span style="white-space:pre">    </span>.balign 16,0x90</div><div>.globl<span style="white-space:pre"> </span>UNIT1$_$TMYRECT_$__$$_equal$TMYRECT$TMYRECT$$BOOLEAN</div><div>UNIT1$_$TMYRECT_$__$$_equal$TMYRECT$TMYRECT$$BOOLEAN:</div><div>.Lc16:</div><div>.seh_proc UNIT1$_$TMYRECT_$__$$_equal$TMYRECT$TMYRECT$$BOOLEAN</div><div><span style="white-space:pre">    </span>leaq<span style="white-space:pre"> </span>-40(%rsp),%rsp</div><div>.Lc18:</div><div>.seh_stackalloc 40</div><div>.seh_endprologue</div><div><span style="white-space:pre">   </span>movq<span style="white-space:pre"> </span>(%rcx),%rax</div><div><span style="white-space:pre">   </span>movq<span style="white-space:pre"> </span>%rax,(%rsp)</div><div><span style="white-space:pre">   </span>movq<span style="white-space:pre"> </span>8(%rcx),%rax</div><div><span style="white-space:pre">  </span>movq<span style="white-space:pre"> </span>%rax,8(%rsp)</div><div><span style="white-space:pre">  </span>movq<span style="white-space:pre"> </span>(%rdx),%rax</div><div><span style="white-space:pre">   </span>movq<span style="white-space:pre"> </span>%rax,16(%rsp)</div><div><span style="white-space:pre"> </span>movq<span style="white-space:pre"> </span>8(%rdx),%rax</div><div><span style="white-space:pre">  </span>movq<span style="white-space:pre"> </span>%rax,24(%rsp)</div><div><span style="white-space:pre"> </span>movq<span style="white-space:pre"> </span>%rsp,%rax</div><div><span style="white-space:pre">     </span>leaq<span style="white-space:pre"> </span>16(%rsp),%rdx</div><div><span style="white-space:pre"> </span>movl<span style="white-space:pre"> </span>(%rax),%ecx</div><div><span style="white-space:pre">   </span>cmpl<span style="white-space:pre"> </span>(%rdx),%ecx</div><div><span style="white-space:pre">   </span>jne<span style="white-space:pre">  </span>.Lj16</div><div><span style="white-space:pre"> </span>movl<span style="white-space:pre"> </span>8(%rax),%ecx</div><div><span style="white-space:pre">  </span>cmpl<span style="white-space:pre"> </span>8(%rdx),%ecx</div><div><span style="white-space:pre">  </span>jne<span style="white-space:pre">  </span>.Lj16</div><div><span style="white-space:pre"> </span>movl<span style="white-space:pre"> </span>4(%rax),%ecx</div><div><span style="white-space:pre">  </span>cmpl<span style="white-space:pre"> </span>4(%rdx),%ecx</div><div><span style="white-space:pre">  </span>jne<span style="white-space:pre">  </span>.Lj16</div><div><span style="white-space:pre"> </span>movl<span style="white-space:pre"> </span>12(%rax),%eax</div><div><span style="white-space:pre"> </span>cmpl<span style="white-space:pre"> </span>12(%rdx),%eax</div><div><span style="white-space:pre"> </span>jne<span style="white-space:pre">  </span>.Lj16</div><div><span style="white-space:pre"> </span>movb<span style="white-space:pre"> </span>$1,%al</div><div><span style="white-space:pre">        </span>jmp<span style="white-space:pre">  </span>.Lj20</div><div>.Lj16:</div><div><span style="white-space:pre">    </span>xorb<span style="white-space:pre"> </span>%al,%al</div><div>.Lj20:</div><div><span style="white-space:pre">  </span>leaq<span style="white-space:pre"> </span>40(%rsp),%rsp</div><div><span style="white-space:pre"> </span>ret</div><div>.seh_endproc</div><div>.Lc17:</div></div><div><br></div><div>With const however, it looks like this:</div><div><br></div><div><div>.section .text.n_unit1$_$tmyrect_$__$$_equal$tmyrect$tmyrect$$boolean,"x"</div><div><span style="white-space:pre">  </span>.balign 16,0x90</div><div>.globl<span style="white-space:pre"> </span>UNIT1$_$TMYRECT_$__$$_equal$TMYRECT$TMYRECT$$BOOLEAN</div><div>UNIT1$_$TMYRECT_$__$$_equal$TMYRECT$TMYRECT$$BOOLEAN:</div><div>.Lc12:</div><div><span style="white-space:pre"> </span>movl<span style="white-space:pre"> </span>(%rcx),%eax</div><div><span style="white-space:pre">   </span>cmpl<span style="white-space:pre"> </span>(%rdx),%eax</div><div><span style="white-space:pre">   </span>jne<span style="white-space:pre">  </span>.Lj18</div><div><span style="white-space:pre"> </span>movl<span style="white-space:pre"> </span>8(%rcx),%eax</div><div><span style="white-space:pre">  </span>cmpl<span style="white-space:pre"> </span>8(%rdx),%eax</div><div><span style="white-space:pre">  </span>jne<span style="white-space:pre">  </span>.Lj18</div><div><span style="white-space:pre"> </span>movl<span style="white-space:pre"> </span>4(%rcx),%eax</div><div><span style="white-space:pre">  </span>cmpl<span style="white-space:pre"> </span>4(%rdx),%eax</div><div><span style="white-space:pre">  </span>jne<span style="white-space:pre">  </span>.Lj18</div><div><span style="white-space:pre"> </span>movl<span style="white-space:pre"> </span>12(%rcx),%eax</div><div><span style="white-space:pre"> </span>cmpl<span style="white-space:pre"> </span>12(%rdx),%eax</div><div><span style="white-space:pre"> </span>jne<span style="white-space:pre">  </span>.Lj18</div><div><span style="white-space:pre"> </span>movb<span style="white-space:pre"> </span>$1,%al</div><div><span style="white-space:pre">        </span>ret</div><div>.Lj18:</div><div><span style="white-space:pre">      </span>xorb<span style="white-space:pre"> </span>%al,%al</div><div><span style="white-space:pre">       </span>ret</div><div>.Lc13:</div></div><div><br></div><div>All of that said, I'd be quite happy to prepare and submit a patch that corrects this, assuming it would be accepted and there is not some hidden reason it is the way it is now, which is what I wanted to confirm here.</div></div></div></div>