How does Rebindable suppress the compiler's optimizations for immutable?
Stefan Koch
uplink.coder at googlemail.com
Fri Feb 15 06:59:31 UTC 2019
On Thursday, 14 February 2019 at 23:55:18 UTC, SimonN wrote:
> std.typecons.Rebindable!(immutable A) is implemented as:
>
> private union {
> immutable(A) original;
> A stripped;
> }
>
> ... at trusted assignment operators...
>
> @property inout(immutable(A)) get() @trusted pure nothrow
> @nogc inout
> {
> return original;
> }
>
> alias get this;
>
> This conforms with the D safety spec: All access to the unsafe
> union goes through the @trusted get() and the trusted
> assignment operators.
>
> Rebindable!(immutable A) r = a1;
> // r.original is a1
> r = a2;
> // r.original is a2
>
> But the compiler may assume that immutable variables -- such as
> the immutable(A) original -- never change and thus may optimize
> code. Since immutable(A) original is assignable in the union,
> such optimization would produce wrong behavior: In the final
> line, the compiler could think that r.original is a1 without
> examining r.original.
>
> How does Rebindable prevent the compiler from optimizing
> according to immutable's rules?
It's easy. You cannot use immutable as the only basis of
optimization.
You need to proof actual immutability via data-flow-analysis over
the whole life-time of your immutable.
When you cannot guarantee actual immutability (within the frame
of interest) don't perform optimizations which are dependent on
it.
So much for the theory, in practice I think that most
optimizations based on immutable are disabled.
Think of immutable as hint for the programmer, not for the
compiler.
More information about the Digitalmars-d-learn
mailing list