<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jun 15, 2017, at 9:24 AM, John McCall via swift-dev &lt;<a href="mailto:swift-dev@swift.org" class="">swift-dev@swift.org</a>&gt; wrote:</div><div class=""><div class=""><br class=""><blockquote type="cite" class="">On Jun 15, 2017, at 10:52 AM, Arnold via swift-dev &lt;<a href="mailto:swift-dev@swift.org" class="">swift-dev@swift.org</a>&gt; wrote:<br class=""><br class=""><blockquote type="cite" class="">On Jun 14, 2017, at 2:56 PM, Dave Abrahams via swift-dev &lt;<a href="mailto:swift-dev@swift.org" class="">swift-dev@swift.org</a>&gt; wrote:<br class=""><br class=""><blockquote type="cite" class="">on Wed Jun 14 2017, Erik Eckstein &lt;<a href="http://swift-dev-AT-swift.org" class="">swift-dev-AT-swift.org</a>&gt; wrote:<br class=""><br class="">I’m about implementing statically initialized arrays. It’s about<br class="">allocating storage for arrays in the data section rather than on the<br class="">heap.<br class=""></blockquote><br class="">W00t! &nbsp;I'd like to do the same for String, i.e. encode the entire buffer<br class="">in the data section. &nbsp;I was looking for Array example code to follow but<br class="">couldn't find it.<br class=""></blockquote><br class="">We have support for constant string buffers as of &nbsp;PR 8701 and PR 8692. The former PR shows the protocol that has to be implemented.<br class=""><br class="">(The implementation currently exposes the ref count ABI. This can/needs to be fixed when we move to a stable abi by running an once initializer)<br class=""></blockquote><br class="">It would be reasonable to arrange for a specific bit pattern to be a guaranteed "do not reference-count this" pattern even under a stable ABI. &nbsp;We just have to be careful about picking it.<br class=""><br class=""></div></div></blockquote><blockquote type="cite" class=""><div class=""><div class="">If we didn't want to do that, the best solution would be an absolute symbol — although we'd have to use an entire word for the refcount, even on 64-bit.</div></div></blockquote><br class=""></div><div>I don't think the absolute symbol size is a problem. We are unlikely to ever make that part of the object header less than a full word. The refcount itself can be a subset of that word, as long as the number of different initial values for the entire word is reasonably small.</div><div><br class=""></div><div>There are some other possible tricks. One is to hardcode the initial value and emit all such constant objects into a dedicated section. Then any future runtime that wants to use a new ABI can find all of the old objects and update them when they are loaded. A dedicated section would also help tools like the linker and shared cache to find these objects for optimization purposes. (That's probably less important for arrays than it is for strings. Note that C strings have their own section for just this reason.) And if these objects are read-only when the ABI is unchanged then the section helps keep the clean objects away from dirty pages.</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">--&nbsp;</div><div class="">Greg Parker &nbsp; &nbsp; <a href="mailto:gparker@apple.com" class="">gparker@apple.com</a>&nbsp; &nbsp; &nbsp;Runtime Wrangler</div><div class=""><br class=""></div><div class=""><br class=""></div></body></html>