<div dir="ltr">Okay, apparently layout is only guaranteed if the reference is to the tuple itself, not a member of the tuple. Don’t know if this is a bug or intended behavior. The above code works when written as <br><br><span style="font-family:monospace,monospace">        var buffers:(VBO:GL.UInt, EBO:GL.UInt) = (0, 0)<br>        withUnsafeMutablePointer(to: &amp;buffers)<br>        {<br>            $0.withMemoryRebound(to: UInt32.self, capacity: 2)<br>            {<br>                glGenBuffers(n: 2, buffers: $0)<br>            }<br>        }</span><br><br><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jul 20, 2017 at 3:01 PM, Taylor Swift via swift-users <span dir="ltr">&lt;<a href="mailto:swift-users@swift.org" target="_blank">swift-users@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><div dir="ltr">This does not seem to be the case…<br><br><span style="font-family:monospace,monospace">    var buffers:(VBO:GL.UInt, EBO:GL.UInt) = (0, 0)<br>    glGenBuffers(n: 2, buffers: &amp;buffers.VBO)<br>    print(buffers)<br>    // &gt; (VBO: 4, EBO: 0)<br><br>    var buffers:(VBO:GL.UInt, EBO:GL.UInt) = (0, 0)<br>    glGenBuffers(n: 1, buffers: &amp;buffers.VBO)<br>    glGenBuffers(n: 1, buffers: &amp;buffers.EBO)<br>    print(buffers)<br>    // &gt; (VBO: 4, EBO: 5)<br></span></div></span><div class="gmail_extra"><br><div class="gmail_quote"><span class="">On Thu, Jul 20, 2017 at 1:18 PM, Johannes Weiß <span dir="ltr">&lt;<a href="mailto:johannesweiss@apple.com" target="_blank">johannesweiss@apple.com</a>&gt;</span> wrote:<br></span><div><div class="h5"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<span><br>
&gt; On 20 Jul 2017, at 5:41 pm, Taylor Swift &lt;<a href="mailto:kelvin13ma@gmail.com" target="_blank">kelvin13ma@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt; Does addressof count as legally observing it?<br>
&gt;<br>
&gt;         var buffers:(GL.UInt, GL.UInt) = (0, 0)<br>
&gt;         glGenBuffers(n: 2, buffers: &amp;buffers.0)<br>
&gt;<br>
&gt; Also, I assume Swift performs a swizzle if the tuple is defined in a separate module from where the pointer to it is constructed?<br>
<br>
</span>yes, that&#39;s legal assuming the called function doesn&#39;t store the pointer and read/write it later.<br>
<div class="m_-3249606950994081846HOEnZb"><div class="m_-3249606950994081846h5"><br>
<br>
&gt;<br>
&gt; On Thu, Jul 20, 2017 at 4:59 AM, Johannes Weiß &lt;<a href="mailto:johannesweiss@apple.com" target="_blank">johannesweiss@apple.com</a>&gt; wrote:<br>
&gt; When you can (legally) observe it, tuples in Swift have guaranteed standard C-style layout.<br>
&gt;<br>
&gt; John McCall confirms this here: <a href="https://lists.swift.org/pipermail/swift-dev/Week-of-Mon-20170424/004481.html" rel="noreferrer" target="_blank">https://lists.swift.org/piperm<wbr>ail/swift-dev/Week-of-Mon-<wbr>20170424/004481.html</a><br>
&gt;<br>
&gt; &gt; On 20 Jul 2017, at 4:33 am, Taylor Swift via swift-users &lt;<a href="mailto:swift-users@swift.org" target="_blank">swift-users@swift.org</a>&gt; wrote:<br>
&gt; &gt;<br>
&gt; &gt; Many APIs like OpenGL take arrays where the atomic unit is multiple elements long. For example, a buffer of coordinates laid out like<br>
&gt; &gt;<br>
&gt; &gt; :[Float] = [ x1, y1, z1, x2, y2, z2, ... , xn, yn, zn ]<br>
&gt; &gt;<br>
&gt; &gt; I want to be able to define in Swift (i.e., without creating and importing a Objective C module) a struct that preserves the layout, so that I can do withMemoryRebound(to:capacity:<wbr>_) or something similar and treat the buffer as<br>
&gt; &gt;<br>
&gt; &gt; struct Point<br>
&gt; &gt; {<br>
&gt; &gt;     let x:Float,<br>
&gt; &gt;         y:Float,<br>
&gt; &gt;         z:Float<br>
&gt; &gt; }<br>
&gt; &gt;<br>
&gt; &gt; :[Point] = [ point1, point2, ... , pointn ]<br>
&gt; &gt;<br>
&gt; &gt; The memory layout of the struct isn’t guaranteed, but will the layout be guaranteed to be in declaration order if I use a tuple inside the struct instead?<br>
&gt; &gt;<br>
&gt; &gt; struct Point<br>
&gt; &gt; {<br>
&gt; &gt;     let _point:(x:Float, y:Float, z:Float)<br>
&gt; &gt;<br>
&gt; &gt;     var x:Float<br>
&gt; &gt;     {<br>
&gt; &gt;         return self._point.x<br>
&gt; &gt;     }<br>
&gt; &gt;<br>
&gt; &gt;     var y:Float<br>
&gt; &gt;     {<br>
&gt; &gt;         return self._point.y<br>
&gt; &gt;     }<br>
&gt; &gt;<br>
&gt; &gt;     var z:Float<br>
&gt; &gt;     {<br>
&gt; &gt;         return self._point.z<br>
&gt; &gt;     }<br>
&gt; &gt; }<br>
&gt; &gt;<br>
&gt; &gt; This is an ugly workaround, but I can’t really think of any alternatives that don’t involve “import something from Objective C”. I am aware that the implementation of structs currently lays them out in declaration order, but I’m looking for something that’s actually defined in the language.<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; ______________________________<wbr>_________________<br>
&gt; &gt; swift-users mailing list<br>
&gt; &gt; <a href="mailto:swift-users@swift.org" target="_blank">swift-users@swift.org</a><br>
&gt; &gt; <a href="https://lists.swift.org/mailman/listinfo/swift-users" rel="noreferrer" target="_blank">https://lists.swift.org/mailma<wbr>n/listinfo/swift-users</a><br>
&gt;<br>
&gt;<br>
<br>
</div></div></blockquote></div></div></div><br></div>
<br>______________________________<wbr>_________________<br>
swift-users mailing list<br>
<a href="mailto:swift-users@swift.org">swift-users@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-users" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-users</a><br>
<br></blockquote></div><br></div>