mirror of
https://github.com/Noratrieb/blog.git
synced 2026-01-14 20:35:02 +01:00
deploy: 379f1b93cb
This commit is contained in:
parent
e6effff870
commit
f7ea5c3dbc
5 changed files with 66 additions and 41 deletions
|
|
@ -125,7 +125,7 @@ this comparison doesn&rsquo;t make sense to me. While <code>Box&lt;T&
|
|||
code <em>know</em> that box is just a pointer, and will abuse that knowledge, accidentally causing UB with it. While this can be
|
||||
mitigated with better docs and teaching, like how no one questions the uniqueness of <code>&amp;mut T</code> (maybe that&rsquo;s also because that
|
||||
one makes intuitive sense, &ldquo;shared xor mutable&rdquo; is a simple concept), I think it will always be a problem,
|
||||
because in my opinion, box being unique and invalidating pointers on move is simply not intiutive.</p>
|
||||
because in my opinion, box being unique and invalidating pointers on move is simply not intuitive.</p>
|
||||
<p>When a box is moved, the pointer bytes change their location in memory. But the bytes the box points to stay the same. They don&rsquo;t
|
||||
move in memory. This is the fundamental missing intuition about the box behaviour.</p>
|
||||
<p>There are also other reasons why the box behaviour is not desirable. Even people who know about the behaviour of box will want
|
||||
|
|
@ -137,18 +137,20 @@ other box-exclusive features it offers. Even worse is <code>string_cache</
|
|||
<p>Then last but not least, there&rsquo;s the opinionated fact that <code>Box&lt;T&gt;</code> shall be implementable entirely in user code. While we are
|
||||
many missing language features away from this being the case, the <code>noalias</code> case is also magic descended upon box itself, with no
|
||||
user code ever having access to it.</p>
|
||||
<h1 id="noalias-noslow">noalias, noslow</h1>
|
||||
<p>There are also several arguments in favour of box being unique and special cased here. To negate the last argument above, it can
|
||||
be said that <code>Box&lt;T&gt;</code> <em>is</em> a very special type. It&rsquo;s just like a <code>T</code>, but on the heap. Using this mental model, it&rsquo;s very easy to
|
||||
justify all the box magic and its unique behaviour.</p>
|
||||
<p>This mental model is one that many people have, but what does this bring us? This is just one mental model of box, and
|
||||
there are other mental models of it (like &ldquo;a reference that manages its lifetime itself&rdquo; or &ldquo;a safe RAII pointer&rdquo;).</p>
|
||||
justify all the box magic and its unique behaviour. But in my opinion, this is not a useful mental model regarding unsafe code,
|
||||
and I prefer the mental model of &ldquo;reference that manages its own lifetime&rdquo;, which doesn&rsquo;t imply uniqueness.</p>
|
||||
<h1 id="noalias-noslow">noalias, noslow</h1>
|
||||
<p>There is one clear potential benefit from this box behaviour. ✨Optimizations✨. <code>noalias</code> doesn&rsquo;t exist for fun, it&rsquo;s something
|
||||
that can bring clear performance wins (for <code>noalias</code> on <code>&amp;mut T</code>, those were measureable). So the only question remains:
|
||||
How much performance does <code>noalias</code> on <code>Box&lt;T&gt;</code> give us now, and how much potential performance improvements could we get in the
|
||||
future? For the latter, there is no simple answer. For the former, there is. <code>rustc</code> has <a href="https://github.com/rust-lang/rust/pull/99527"><em>no</em> performance improvements</a> from being compiled with <code>noalias</code> on <code>Box&lt;T&gt;</code>.</p>
|
||||
<strong>How much performance does <code>noalias</code> on <code>Box&lt;T&gt;</code> give us now, and how many potential performance improvements could we get in the
|
||||
future?</strong> For the latter, there is no simple answer. For the former, there is. <code>rustc</code> has <a href="https://github.com/rust-lang/rust/pull/99527"><em>no</em> performance improvements</a>
|
||||
from being compiled with <code>noalias</code> on <code>Box&lt;T&gt;</code>.</p>
|
||||
<p>I have not yet benchmarked ecosystem crates without box noalias and don&rsquo;t have the capacity to do so right now, so I would be very
|
||||
grateful if anyone wanted to pick that up and report the results.</p>
|
||||
<p>There are also crates on <a href="https://crates.io/">crates.io</a> like <a href="https://crates.io/crates/aliasable">aliasable</a> that already
|
||||
provide an aliasable version of <code>Box&lt;T&gt;</code>, which is used by the self-referential type helper crate <a href="https://crates.io/crates/ouroboros">ouroboros</a>.</p>
|
||||
<h1 id="a-way-forward">a way forward</h1>
|
||||
<p>Based on all of this, I do have a solution that, in opinion, will fix all of this, even potential performance regressions with
|
||||
box. First of all, I think that even if there are some performance regressions in ecosystem crates, the overall tradeoff goes
|
||||
|
|
@ -156,6 +158,9 @@ against the current box behaviour. Unsafe code wants to use box, and it is reaso
|
|||
remove all uniqueness from <code>Box&lt;T&gt;</code>, and treat it just like a <code>*const T</code> for the purposes of aliasing. This will make it more
|
||||
predictable for unsafe code, and comes at none or only a minor performance cost.</p>
|
||||
<p>But this performance cost may be real, and especially the future optimization value can&rsquo;t be certain. I do think that there
|
||||
should be a way to get the uniqueness guarantees in some other way than through box. One possibility would be to use a <code>&amp;'static mut T</code> that is unleaked for drop, but the semantics of this are still <a href="https://github.com/rust-lang/unsafe-code-guidelines/issues/316">unclear</a>. If that is not possible, maybe exposing <code>std::ptr::Unique</code> (with it getting boxes aliasing semantics) could be desirable. For this, all existing usages of <code>Unique</code> inside the standard library would have to be removed though.</p>
|
||||
should be a way to get the uniqueness guarantees in some other way than through box. One possibility would be to use a
|
||||
<code>&amp;'static mut T</code> that is unleaked for drop, but the semantics of this are still <a href="https://github.com/rust-lang/unsafe-code-guidelines/issues/316">unclear</a>.
|
||||
If that is not possible, maybe exposing <code>std::ptr::Unique</code> (with it getting boxes aliasing semantics) could be desirable.
|
||||
For this, all existing usages of <code>Unique</code> inside the standard library would have to be removed though.</p>
|
||||
<p>I guess what I am wishing for are some good and flexible raw pointer types. That&rsquo;s still in the stars&hellip;</p>
|
||||
<p>For more information about this topic, see <a href="https://github.com/rust-lang/unsafe-code-guidelines/issues/326">https://github.com/rust-lang/unsafe-code-guidelines/issues/326</a></p></content></item></channel></rss>
|
||||
Loading…
Add table
Add a link
Reference in a new issue