More radical ideas about gc and reference counting

Andrei Alexandrescu via Digitalmars-d digitalmars-d at puremagic.com
Wed Apr 30 13:57:26 PDT 2014


On 4/30/14, 1:46 PM, deadalnix wrote:
> On Wednesday, 30 April 2014 at 20:21:33 UTC, Andrei Alexandrescu wrote:
>> That means classes that need cleanup (either directly or by having
>> fields that are structs with destructors) would need to garner that by
>> other means, such as reference counting or manual. We're considering
>> deprecating ~this() for classes in the future.
>>
>
> Not sure how I feel about that.

"Ecstatic" is what you're looking for.

> This has been proposed as a solution to
> some GC issue at last DConf and has been dismissed. Your post is unclear
> on why this decision has changed. There must be some new information or
> data that inform this decision.
>
> Or is it random ?

I don't remember a proposal being made that made slices of structs with 
destructors distinct from other slices.

> Also, what about cycle in RC things?

Resource leaks may happen in programs in any language. I'm prepared to 
allow leaks in certain cases, and I posit here that such cases are rare 
(arrays of objects that embed references to the very array they're in).

> Also, RC is good on top of GC, so
> you can collect loop, especially if we are going to RC automagically.
> That is a major issue.

That stays, and it's useful. I'm talking destructors here.

> Finally, immutable is sharable accross thread. That mean, even if we
> bypass the type system, that RC must be atomic for immutable.
> As they
> convert automatically for co,st, that mean that all const code will be
> full of atomic increment/decrement. They are bad for the CPU, and cannot
> be optimized away.

Good point. I see that as a problem, albeit a solvable one.

> That mean we are back to having a const and a mutable version of
> functions for performance reasons.

I don't think that's the case. We could and should be able to only use 
refcounting for truly immutable slices. (Using a bit in the counter to 
indicate sharing comes to mind.)

>> RCSlice!T will not convert implicitly to void[]. Explicit cast(void[])
>> will be allowed, and will ignore the reference count (so if a void[]
>> extracted from a T[] via a cast outlives all slices, dangling pointers
>> will ensue).
>>
>
> This won't work. array have a lot of magic that cannot be created as
> library. ie:
>
> RCSlice!(const T) has nothing to do with const(RCSlice!T) as far as the
> compiler is concerned.

We need to improve the language to allow for such. Did I mention it's 
not going to be easy?


Andrei



More information about the Digitalmars-d mailing list