Safe reference counting cannot be implemented as a library
deadalnix via Digitalmars-d
digitalmars-d at puremagic.com
Tue Oct 27 20:55:22 PDT 2015
On Wednesday, 28 October 2015 at 01:13:16 UTC, Walter Bright
wrote:
>
> It's not just safety. If the compiler knows that reference
> counting is going on, it can potentially elide a lot of the
> overhead. If it is faced with an arbitrary library solution, it
> only has a worm's eye view of it, and cannot do higher level
> optimizations.
I don't think the compiler can do that much more, but before I
address that point, let me mention that intrinsic can be added
for inc and dec, which would be much more lightweight for the
language at large.
Now as to why I think this wouldn't give that much. First, if
exception can be thrown, then all bets are pretty much off, as
inc and dec do not go by pairs anymore. So we are down to the no
exception situation. In that case, pairs are fairly visible to
the compiler and can be optimized away or combined, that is
already the kind of things that optimizer are good at.
But if, so, how do you explain the C++ situation, where nothing
is elided (or ObjC's) ?
Well, there is a major difference with these languages: sharing
by default. It means that inc and dec must be (atomic and
ordered) or synchronized, which means that, as far as the
compiler is concerned, all bets are off and the optimizer can't
do its job.
This doesn't really apply to D, so I don't expect this to be a
problem. And even if there is: intrinsic can save the day to hint
the optimizer, no need for heavyweight language addition.
Now, let's get back to the exception case, as it is IMO the most
interesting one. What if one is willing to accept leakage on
exception throwing. That would get the optimizer back into the
game and remove a lot of "dark matter" as Andrei calls it, which
have a real cost on term of icache pressure and exception
unwinding cost (one now doesn't have to resume each frame to
maintain refcount).
If I had to go about this, I'd rather see the introduction a
scope(exit/success/failure) like mechanism for destructors rather
than something ref counting specific.
More information about the Digitalmars-d
mailing list