D Ranges
Jonathan M Davis
jmdavisProg at gmx.com
Sun Sep 15 01:52:31 PDT 2013
On Sunday, September 15, 2013 10:39:40 monarch_dodra 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.
>
> 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).
>
> 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!
>
> 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).
Yeah. RefCounted could/should definitely be improved, but the concept is
essentially the same as smart_ptr in C++11. In many ways, smart pointers are
far superior to using the GC, and I really think that we should do a better
job of supporting them and promoting them. There are obviously plenty of cases
where the GC is better or even necessary, but in many cases - particularly
with objects - smart pointers are arguably a much better way to go.
- Jonathan M Davis
More information about the Digitalmars-d
mailing list