<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On May 6, 2017, at 10:27 PM, Nate Birkholz via swift-users &lt;<a href="mailto:swift-users@swift.org" class="">swift-users@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Classes and structs are different things. Classes are passed by reference, structs are passed by value with copy on write.&nbsp;</div></div></blockquote><div><br class=""></div>This is not correct. Array, and other types, implement copy-on-write themselves, but this is not true of arbitrary structs.</div><div><br class=""></div><div>To answer Kelvin's question, yes, the optimizer will be able to see through that code _assuming_ it can see the definition in a way it can optimize (generally speaking, this means not something which will be dynamically dispatched, and where the implementation is available (i.e. the same file, or the same module with whole module optimization enabled)).</div><div><br class=""></div><div>You can verify this by simply writing a small sample program and spot checking the assembly matches what you want, for example:</div><div>--</div><div><div><b class="">$ cat z.swift&nbsp;</b></div><div>struct Vertex {</div><div>&nbsp; &nbsp; let x: Double, y: Double</div><div>&nbsp; &nbsp; var r:Int, g:Int, b:Int</div><div>&nbsp; &nbsp; let s:Double, t:Double</div><div>&nbsp; &nbsp; var selected:Bool</div><div>}</div><div><br class=""></div><div>private func taxicab_distance(_ v1:Vertex, _ v2:Vertex) -&gt; Double {</div><div>&nbsp; &nbsp; return v2.x - v1.x + v2.y - v1.y</div><div>}</div><div><br class=""></div><div>func f0(a: Vertex, b: Vertex) -&gt; Double {</div><div>&nbsp; return taxicab_distance(a, b)</div><div>}</div><div><br class=""></div><div><b class="">$ swiftc -Ounchecked -S -o - z.swift | grep 'main2f0' -A8</b></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>.private_extern<span class="Apple-tab-span" style="white-space:pre">        </span>__T04main2f0SdAA6VertexV1a_AD1btF</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>.globl<span class="Apple-tab-span" style="white-space:pre">        </span>__T04main2f0SdAA6VertexV1a_AD1btF</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>.p2align<span class="Apple-tab-span" style="white-space:pre">        </span>4, 0x90</div><div>__T04main2f0SdAA6VertexV1a_AD1btF:</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>pushq<span class="Apple-tab-span" style="white-space:pre">        </span>%rbp</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>movq<span class="Apple-tab-span" style="white-space:pre">        </span>%rsp, %rbp</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>movsd<span class="Apple-tab-span" style="white-space:pre">        </span>(%rsi), %xmm0</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>subsd<span class="Apple-tab-span" style="white-space:pre">        </span>(%rdi), %xmm0</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>addsd<span class="Apple-tab-span" style="white-space:pre">        </span>8(%rsi), %xmm0</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>subsd<span class="Apple-tab-span" style="white-space:pre">        </span>8(%rdi), %xmm0</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>popq<span class="Apple-tab-span" style="white-space:pre">        </span>%rbp</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>retq</div><div class="">--</div><div class=""><br class=""></div><div class="">&nbsp;- Daniel</div><div class=""><br class=""></div></div><div><br class=""></div><div><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class=""><br class=""></div><div class="">Strings and Arrays are structs, not classes.</div></div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Sat, May 6, 2017 at 10:24 PM, Kelvin Ma <span dir="ltr" class="">&lt;<a href="mailto:kelvin13ma@gmail.com" target="_blank" class="">kelvin13ma@gmail.com</a>&gt;</span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto" class=""><div class=""></div><div class="">I hear that a lot but why do all the official sources sound like copy-on-write is something you have to manually implement with a class and isUniquelyReferenced if it’s not an array or a string?</div><div class=""><br class="">On May 7, 2017, at 12:02 AM, Nate Birkholz &lt;<a href="mailto:nbirkholz@gmail.com" target="_blank" class="">nbirkholz@gmail.com</a>&gt; wrote:<br class=""><br class=""></div><blockquote type="cite" class=""><div class=""><div class="">Let me try one more time, my stupid phone keeps changing words.&nbsp;</div><div id="m_-6428509005955294910AppleMailSignature" class=""><br class=""></div><div id="m_-6428509005955294910AppleMailSignature" class="">ACTUALLY, the struct is a pointer until it's written to, and is only copied on write.<br class=""><br class="">Sent from my iPhone, please excuse brevity and errors</div><div class=""><br class="">On May 6, 2017, at 9:59 PM, Nate Birkholz &lt;<a href="mailto:nbirkholz@gmail.com" target="_blank" class="">nbirkholz@gmail.com</a>&gt; wrote:<br class=""><br class=""></div><blockquote type="cite" class=""><div class=""><div class="">Oddly, until it's *written* you will be working with a pointer.<br class=""><br class="">Sent from my iPhone, please excuse brevity and errors</div><div class=""><br class="">On May 6, 2017, at 9:33 PM, Kelvin Ma via swift-users &lt;<a href="mailto:swift-users@swift.org" target="_blank" class="">swift-users@swift.org</a>&gt; wrote:<br class=""><br class=""></div><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class=""><div class=""><font face="monospace,monospace" class="">If I have a “large” struct like<br class=""><br class="">struct Vertex<br class="">{<br class="">&nbsp;&nbsp;&nbsp; let x:Double, y:Double<br class="">&nbsp;&nbsp;&nbsp; var r:Int, g:Int, b:Int<br class="">&nbsp;&nbsp;&nbsp; let s:Double, t:Double<br class="">&nbsp;&nbsp;&nbsp; var selected:Bool<br class="">}<br class=""><br class=""></font></div><div class=""><font face="monospace,monospace" class="">and I want to pass it to a function without modifying it like<br class=""></font></div><div class=""><font face="monospace,monospace" class=""><br class="">func taxicab_distance(_ v1:Vertex, _ v2:Vertex) -&gt; Double<br class="">{<br class="">&nbsp;&nbsp;&nbsp; return v2.x - v1.x + v2.y - v1.y<br class="">}<br class=""><br class=""></font></div><div class=""><font face="monospace,monospace" class="">Will the entire struct Vertex get copied and pushed onto the stack, or will only the relevant members be passed to the function?<br class=""><br class=""></font></div><div class=""><font face="monospace,monospace" class="">In other words, does the compiler know to optimize this call down to<br class=""><br class=""></font><font face="monospace,monospace" class="">func taxicab_distance(v2x:Double, v1x:Double, v2y:Double, v1y:Double) -&gt; Double<br class="">{<br class="">&nbsp;&nbsp;&nbsp; return v2x - v1x + v2y - v1y<br class="">}<br class=""><br class="">?<br class=""></font></div></div></div>
</div></blockquote><blockquote type="cite" class=""><div class=""><span class="">______________________________<wbr class="">_________________</span><br class=""><span class="">swift-users mailing list</span><br class=""><span class=""><a href="mailto:swift-users@swift.org" target="_blank" class="">swift-users@swift.org</a></span><br class=""><span class=""><a href="https://lists.swift.org/mailman/listinfo/swift-users" target="_blank" class="">https://lists.swift.org/<wbr class="">mailman/listinfo/swift-users</a></span><br class=""></div></blockquote></div></blockquote></div></blockquote></div></blockquote></div><br class=""><br clear="all" class=""><div class=""><br class=""></div>-- <br class=""><div class="gmail_signature" data-smartmail="gmail_signature">Nate Birkholz</div>
</div>
_______________________________________________<br class="">swift-users mailing list<br class=""><a href="mailto:swift-users@swift.org" class="">swift-users@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-users<br class=""></div></blockquote></div><br class=""></body></html>