On Tuesday, 3 March 2015 at 18:48:36 UTC, Andrei Alexandrescu wrote:
On 3/3/15 9:00 AM, Zach the Mystic wrote:
On Tuesday, 3 March 2015 at 16:31:07 UTC, Andrei Alexandrescu wrote:
I was dazzed, but I'm not anymore. I wrote my concern here:

http://forum.dlang.org/post/[email protected]

There's a misunderstanding here. The object being assigned keeps a
trailing list of past values and defers their deallocation to
destruction. -- Andrei

So you need an extra pointer per instance?

Yah, or define your type to be single-assignment (probably an emerging idiom). You can massage the extra pointer with other data thus reducing its cost.

Isn't that a big price to
pay? Is the only problem we're still trying to solve aliasing which is not recognized as such and therefore doesn't bump the refcounter like it should? An extra pointer would be overkill for that. Isn't it better to
just recognize the aliasing when it happens?

It's all tradeoffs. This has runtime overhead.

Isn't allocating and collecting a freelist also overhead?

A static analysis would have the challenges of being permissive enough, cheap enough, not add notational overhead, etc. etc.

It's certainly permissive: you can do anything, and compiler wraps uncertain operations with add/release cycles automatically. These are: passing a global as a mutable reference to an impure function; aliasing the same variable in two parameters with itself. The unoptimized lowerings would be:

{
  auto tmp = myGlobal; // bump count
  impureFun(myGlobal);
}  // tmp destroyed, --count

{
  auto tmp2 = c; // bump count
  fun(c, c);
} // --count

The only addition is an optimization where the compiler elides the assignments and calls the add/release cycles directly.

Reply via email to