<div dir="ltr"><div dir="ltr">On Sun, Jun 16, 2019 at 9:30 AM Ryan Joseph <<a href="mailto:genericptr@gmail.com">genericptr@gmail.com</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Here’s a little example of the problem. What I propose is that we either add a 3rd boolean parameter to the Copy operator or add a new Move operator which is preferred over the Copy operator if it exists (this is much more work obviously but maybe has some benefit). <br></blockquote><div><br></div><div>I can't actually check the assembly at the moment, but I'm pretty sure if your example was written like the following, it would not call `Copy` for the `TList<Integer>.Create(10)` assignment:</div><div><br></div><div>{$mode objfpc}<br>{$modeswitch advancedrecords}<br><br>program test;<br><br>type<br>  generic TList<T> = record<br>      data: array of T;</div><div>      // static class function instead of actual constructor<br>      class function Create(num: integer): TList; static; inline;<br>      class operator Copy(constref src: TList; var dest: TList);<br>  end;<br><br>class function TList.Create(num: integer): TList;<br>begin<br>  SetLength(result.data, num);<br>end;</div><div><br>class operator TList.Copy(constref src: TList; var dest: TList);<br>begin</div><div>  // no reason not to use `move` here, I wouldn't say<br>  move(src.data, dest.data, sizeof(T) * Length(src.data));<br>end;<br><br>var<br>  a, b: specialize TList<integer>;<br>  i: integer;<br>begin<br>  // TList.Create allocates a new array but we don’t really need to copy<br>  // on assignment because the source is a temporary object that doesn’t<br>  // actually exist at any static address.<br>  a := specialize TList<integer>.Create(10);<br>  for i := 0 to 9 do a.data[i] := i;<br>  b := a;<br>  for i := 0 to 9 do writeln(b.data[i]);<br>end.</div></div></div>