D Ranges

Dmitry Olshansky dmitry.olsh at gmail.com
Sun Sep 15 05:17:22 PDT 2013


15-Sep-2013 12:39, monarch_dodra пишет:
> On Saturday, 14 September 2013 at 06:18:02 UTC, Jonathan M Davis wrote:
> I have a few issues with ref counted.
>
> First, if you *ever* place one in an array or an AA, then you will leak.
> It is NOT designed for simply incorporating reference, but for
> deterministic finalization.

Another problem with built-in AAs...

>
> Second, it has an elaborate postblit and opAssign. This is not a big
> issue in itself, but their sole existence does cause dmd to generate
> code that is sub-optimal. It also means it can't take the "optimal"
> route in a lot of algorithms (array has to emplace each element
> individually, for example).

Seriously we could do a better job then that.. For instance blit the 
whole data, then call postblits on that range. Exception safety would be 
trickier to achieve. Even better one day I now expect compiler to be 
able to know that e.g. RefCounted is registered as ARC-capable type then 
the compiler should elide call to ref-counting.

> Finally, a RefCounted will implicitly cast to its payload. I think this
> is *horrible*. Before you know it, the Payload will have "jettisoned"
> its wrapper, and you'll be operating on your value-type payload "raw".
> For example:
> void foo(T t);
> RefCounted!T myRecCounted;
> foo(myRefCounted); //Passes. Oops!

Well it does a copy. Which is IMO perfectly fine.
If you want to prevent that (at least in theory) you should simply mark 
postblit of T as disabled.


> The workaround would be to either require explicit "get" to go from ref
> counted to payload (breaking existing code), or to entirelly wrap the
> RefCounted as a member inside the struct (requires boilerplate code).

There is no need to prevent that in general case. Only RAII kind of 
things implemented with RefCounted would have problem copying-out the 
payload but these should have post-blit disabled for their "value" and 
consequently would not compile.

> --------
>
> Overall, if I need a reference semantic struct, I find it much simpler
> for it to just hold a GC pointer to a payload.

Ehm.. Isn't finalized class is just that? Plus bit of overhead for monitor.

> Though to be honest, as H.S. Teoh, I seriously wonder why I even bother,
> when I could just use a final class. With proper "private constructors +
> non-member "make" function", you can make your choice outright
> transparent to the final user too, meaning you can "fast prototype" with
> classes, and later change to structs if you think it is worth it.

This is true. And in fact I would encourage every D programmer to never 
expose constructors and always provide factory functions. These days 
constructors are constrained by a set of arcane limitations thusly suck 
beyond measure in every way possible. But you need them to say 
initialize immutable members, hence _use_ - but don't _expose_ them.

-- 
Dmitry Olshansky


More information about the Digitalmars-d mailing list