I should add, it serves to clarify intention to the reader as well. Take, for instance:<br><br>let array = [0, 1, 2]<br>let x = strideofValue(array[0]) // using the Swift 2 name<br>// stdlib testing code actually does something like this at one point<br><br>A reader can see on inspection that x is the correct increment for advancing through the raw bytes of the array. If I edit the first line to `let array = [0, 1.5, 2]`, x is still appropriate for that use on 32-bit systems. And if I tried to use x to advance through the bytes of a different array2, it would definitely prompt a reader to take a second look at the code.<br><br>Of course, it is trivial to rewrite the second line as `let x = MemoryLayout&lt;Int&gt;.stride` and to adjust if the type of array changes. But combine that with a scenario such as Dave&#39;s, and it can be much more difficult for a reader to discern whether the code is asking for the memory layout properties of the right type.<br><br><div class="gmail_quote"><div dir="ltr">On Sun, Aug 7, 2016 at 10:21 PM Dave Abrahams &lt;<a href="mailto:dabrahams@apple.com">dabrahams@apple.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
on Sun Aug 07 2016, Brandon Knope &lt;bknope-AT-me.com&gt; wrote:<br>
<br>
&gt; Yes but:<br>
&gt;<br>
&gt; extension MemoryLayout {<br>
&gt;   @_transparent<br>
&gt;   public static func size(ofValue _: T) -&gt; Int {<br>
&gt;     return MemoryLayout.size<br>
&gt;   }<br>
&gt;   @_transparent<br>
&gt;   public static func stride(ofValue _: T) -&gt; Int {<br>
&gt;     return MemoryLayout.stride<br>
&gt;   }<br>
&gt;   @_transparent<br>
&gt;   public static func alignment(ofValue _: T) -&gt; Int {<br>
&gt;     return MemoryLayout.alignment<br>
&gt; Vs<br>
&gt;<br>
&gt; public struct MemoryLayout&lt;T&gt; {<br>
&gt;      public static var size: Int { return _sizeof(T) }<br>
&gt;      public static var stride: Int { return _strideof(T) }<br>
&gt;      public static var alignment: Int { return _alignof(T) }<br>
&gt; }<br>
&gt;<br>
&gt; I see the obvious difference between the two in their names and signature, but what is the need for both?<br>
&gt;<br>
&gt; It looks duplicated for the most part, so some clarification would be nice.<br>
<br>
The use case is this: you have a value, but you don&#39;t have its type at<br>
compile-time, and you want memory layout information.  For example, it<br>
might be the result of<br>
<br>
     let x = (0..&lt;20).reversed().lazy.map { $0 * 3 }<br>
<br>
(which has a horrible type you wouldn&#39;t want to spell out) and you want<br>
to know the size of the instance x.<br>
<br>
     MemoryLayout.size(ofValue: x)<br>
<br>
will work here.  Getting a type to pass in the angle brackets requires<br>
jumping through lots of hoops and is easy to get wrong.<br>
<br>
--<br>
-Dave<br>
</blockquote></div>