Smart pointers instead of GC?

Adam Wilson flyboynw at gmail.com
Sat Feb 1 20:58:04 PST 2014


On Sat, 01 Feb 2014 20:43:37 -0800, Frank Bauer <y at z.com> wrote:

> On Sunday, 2 February 2014 at 04:26:16 UTC, Adam D. Ruppe wrote:
>> On Sunday, 2 February 2014 at 03:38:03 UTC, Andrei Alexandrescu wrote:
>>> Whoa, this won't work without an explosion in language complexity.
>>
>> The complexity is already there, it is just hidden. But most the  
>> capacity to deal with it is already there too:
>>
>> Owning!T is just a struct with ~this() { free(me); }. Referencing  
>> counting is just a struct with this(this) { payload.ref++; } ~this() {  
>> payload.ref--; } (with a few optimizations to remove ref++; ref--;,  
>> which IMO should be there anyway!)
>>
>> Borrowed is a reference we can use or copy, but must not free (delete  
>> is deprecated!) and ought not store.
>>
>> GC is a reference that we don't have to free AND is ok to store.
>>
>>
>>
>> The language just conflates the latter two. And the spec even gives us  
>> some hope that it isn't supposed to with the scope storage class,  
>> though IMO the difference is more of a type thing than a storage class  
>> thing. A GC reference should implicitly convert to a borrowed reference  
>> (e.g. alias slice this;) but not vice versa. The only way to go from  
>> borrowed -> GC (or any other really) would be cowboy it with cast() or  
>> copying the contents.
>>
>>
>>
>> BTW I like a lot of the ideas Rust has in this regard, but I don't  
>> think we have to go all the way they did. But having:
>>
>> char[] foo = new char[](1024);
>>
>> and
>>
>> char[1024] buffer;
>> char[] foo = buffer[];
>>
>>
>> both work and yield exactly the same type is trouble.
>
>
> I see light ...
>
> There is one little complication of owning pointers interacting with  
> borrowed pointers that might prevent a straightforward approach (I'm  
> sure there's more): owning pointers must not go out of scope or be  
> reassigned as long as there are outstanding references to them alive  
> (i.e. in scope as well).
>
> I don't see ATM how this could be done at zero cost without intrinsic  
> compiler support. Only the compiler could enforce this free of cost as  
> far as I see.

I believe it should be possible to argue for the compiler support as long  
as it doesn't add any language level complexity. I too like how this works.

However, full ARC presents quite a few more problems. You will certainly  
need to add at least one more keyword to the language ('arc' anyone?) and  
a metric ton of compiler support.

-- 
Adam Wilson
GitHub/IRC: LightBender
Aurora Project Coordinator


More information about the Digitalmars-d mailing list