<div dir="ltr">Thanks, you are correct. Very helpful.</div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature">  -- Howard.<br></div></div>
<br><div class="gmail_quote">On 24 March 2016 at 11:20, Kate Stone <span dir="ltr">&lt;<a href="mailto:k8stone@apple.com" target="_blank">k8stone@apple.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word">You’re almost certainly seeing side effects of not keeping the instance of TestClass alive long enough for the unsafe pointer to still refer to an allocated malloc block.  A quick REPL session illustrates this fact:<div><br></div><div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span style="color:#a9a9a9">  1&gt; </span><span>class TestClass { </span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span style="color:#a9a9a9">  2. </span><span>    let a = 0 </span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span style="color:#a9a9a9">  3. </span><span>    let b: Int? = nil </span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(169,169,169)"><span>  4. </span><span style="color:#000000">}</span></div><div><span style="color:#000000"><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span style="color:#a9a9a9">  5&gt; </span><span>import Foundation</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span style="color:#a9a9a9">  6&gt; </span><span>malloc_size(unsafeAddressOf(TestClass())) </span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(52,187,199)"><span>$R0: Int = 0</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span style="color:#a9a9a9">  7&gt; </span><span>let x = TestClass()</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(52,187,199)"><span>x: TestClass = {</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(52,187,199)"><span>  a = 0</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(52,187,199)"><span>  b = nil</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(52,187,199)"><span>}</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span style="color:#a9a9a9">  8&gt; </span><span>malloc_size(unsafeAddressOf(x))</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(52,187,199)"><span>$R1: Int = 48</span></div><div><span><br></span></div></span></div><div>On line 6 the result of the TestClass() expression is being used only to call unsafeAddressOf, and then it’s being freed before the call to malloc_size.  On line 8 the variable x is retaining the instance so the malloc’ed region can be measured.</div><div><br></div><div>Of course all of this relies on the implementation assumption that allocated objects go on malloc’s heap and is subject to implementation details about object layout.  So while this may be instructive now it’s certainly no guarantee of how things will work in the future.</div><span class=""><div><span style="color:#000000"><br></span></div><div>
<div style="color:rgb(0,0,0);letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;word-wrap:break-word"><div style="color:rgb(0,0,0);letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;word-wrap:break-word"><div style="color:rgb(0,0,0);letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;word-wrap:break-word"><div style="color:rgb(0,0,0);letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;word-wrap:break-word"><div style="font-family:LucidaGrande;word-wrap:break-word"><div style="word-wrap:break-word"><font color="#424242" style="font-family:&#39;Lucida Grande&#39;;font-size:x-small">Kate Stone</font><span style="font-family:&#39;Lucida Grande&#39;;font-size:x-small"> </span><font color="#009193" style="font-family:&#39;Lucida Grande&#39;;font-size:x-small"><a href="mailto:k8stone@apple.com" target="_blank">k8stone@apple.com</a></font></div><div style="font-family:Times;word-wrap:break-word"><font face="Lucida Grande" size="1"><font color="#009193"></font> Xcode <font color="#424242">Low Level Tools</font></font></div></div></div></div></div></div>
</div>
<br></span><div><div class="h5"><div><blockquote type="cite"><div>On Mar 23, 2016, at 5:13 PM, Howard Lovatt &lt;<a href="mailto:howard.lovatt@gmail.com" target="_blank">howard.lovatt@gmail.com</a>&gt; wrote:</div><br><div><div dir="ltr">@Kate,<div><br></div><div>I don&#39;t seem to be able to get `malloc_...` to work. EG:</div><div><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">class TestClass {<br>    let a = 0<br>    let b: Int? = nil<br>}<br>@_silgen_name(&quot;swift_class_getInstanceExtents&quot;) func swift_class_getInstanceExtents(theClass: AnyClass) -&gt; (negative: UInt, positive: UInt)<br>print(&quot;swift_class_getInstanceExtents = \(swift_class_getInstanceExtents(TestClass))&quot;)<br>let requiredSize = malloc_size(unsafeAddressOf(TestClass()))<br>print(&quot;malloc_size = \(requiredSize)&quot;)<br>print(&quot;malloc_good_size = \(malloc_good_size(requiredSize))&quot;)<br></blockquote><br>Prints:<div><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">swift_class_getInstanceExtents = (0, 33)<br>malloc_size = 0<br>malloc_good_size = 16<br></blockquote><br><div>The `swift_class_getInstanceExtents` seems correct to me: 16 bytes for class overhead + 16 bytes for `a` and `b` + 1 byte because `b` is an optional = 33 bytes.</div><div><br></div><div>Not sure what `malloc_...` is giving?</div></div><div class="gmail_extra"><br clear="all"><div><div>  -- Howard.<br></div></div>
<br><div class="gmail_quote">On 24 March 2016 at 10:39, Kate Stone <span dir="ltr">&lt;<a href="mailto:k8stone@apple.com" target="_blank">k8stone@apple.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word">I definitely concur that tools like Instruments are the best way to understand the impact of decisions on memory across the board.  For fine-grained inquiries about memory use you can also rely on malloc family functions to make inquiries:<div><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div>let required_size = malloc_size(unsafeAddressOf(<i>object_reference</i>))</div><div>let actual_size = malloc_good_size(required_size)</div></blockquote><div><br><div>
<div style="letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;word-wrap:break-word"><div style="letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;word-wrap:break-word"><div style="letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;word-wrap:break-word"><div style="letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;word-wrap:break-word"><div style="font-family:LucidaGrande;word-wrap:break-word"><div style="word-wrap:break-word"><font color="#424242" style="font-family:&#39;Lucida Grande&#39;;font-size:x-small">Kate Stone</font><span style="font-family:&#39;Lucida Grande&#39;;font-size:x-small"> </span><font color="#009193" style="font-family:&#39;Lucida Grande&#39;;font-size:x-small"><a href="mailto:k8stone@apple.com" target="_blank">k8stone@apple.com</a></font></div><div style="font-family:Times;word-wrap:break-word"><font face="Lucida Grande" size="1"><font color="#009193"></font> Xcode <font color="#424242">Low Level Tools</font></font></div></div></div></div></div></div>
</div>
<br><div><blockquote type="cite"><div><div><div>On Mar 23, 2016, at 3:59 PM, Howard Lovatt via swift-users &lt;<a href="mailto:swift-users@swift.org" target="_blank">swift-users@swift.org</a>&gt; wrote:</div><br></div></div><div><div><div><div dir="ltr">Thanks, I will give that a try</div><div class="gmail_extra"><br clear="all"><div><div>  -- Howard.<br></div></div>
<br><div class="gmail_quote">On 24 March 2016 at 03:17, Jens Alfke <span dir="ltr">&lt;<a href="mailto:jens@mooseyard.com" target="_blank">jens@mooseyard.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><br><div><blockquote type="cite"><div>On Mar 22, 2016, at 11:04 PM, Howard Lovatt via swift-users &lt;<a href="mailto:swift-users@swift.org" target="_blank">swift-users@swift.org</a>&gt; wrote:</div><br><div><div dir="ltr" style="font-family:Alegreya-Regular;font-size:15px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">I am writing custom collection classes and trying to assess which one is better, both in terms of performance and memory usage. Won&#39;t be used in &#39;real&#39; code, just to guide development.</div></div></blockquote></div><br><div>You might consider using heap profiling tools too, like (on Mac OS) the Instruments app or the `heap` command-line tool. If you use these while running a benchmark app using your API, it can show you how much total heap space gets used.</div><div><br></div><div>Actual heap usage can differ from the raw “sizeof” a data type, since allocators will often round up block sizes or return a somewhat larger block than necessary. Heap fragmentation can also increase memory usage beyond what you’d expect, and different allocation patterns can affect fragmentation.</div><span><font color="#888888"><div><br></div><div>—Jens</div></font></span></div></blockquote></div><br></div></div></div>
_______________________________________________<br>swift-users mailing list<br><a href="mailto:swift-users@swift.org" target="_blank">swift-users@swift.org</a><br><a href="https://lists.swift.org/mailman/listinfo/swift-users" target="_blank">https://lists.swift.org/mailman/listinfo/swift-users</a><br></div></blockquote></div><br></div></div></blockquote></div><br></div>
</div></blockquote></div><br></div></div></div></div></blockquote></div><br></div>