New slides about Go

Denis Koroskin 2korden at gmail.com
Fri Oct 15 10:41:47 PDT 2010


On Fri, 15 Oct 2010 21:34:39 +0400, Walter Bright  
<newshound2 at digitalmars.com> wrote:

> Max Samukha wrote:
>> On 10/15/2010 12:32 PM, Walter Bright wrote:
>>>
>>> The example relies on taking the address of a ref in a safe function.  
>>> To
>>> close this hole, it appears that should be disallowed.
>>  And disallowing it makes references not so useful.
>
> I don't see why. They're useful enough.
>
>
>> What I like about Go's solution is that it is consistent with closures.  
>> When a group of locals escape with a closure (that is when the address  
>> of the local function using that group is taken) they are copied to  
>> heap. When a local escape by ref (that is when the address of the local  
>> is taken), it is also copied to heap.
>
> I understand how it works. There is a downside to it, though. In D2,  
> closures get copied to the GC heap if there is a possibility of an  
> escaping reference. A lot of people complain about this being unexpected  
> hidden overhead.
>
> The trouble with "copy any ref'd local to the heap" automatically  
> happening is the biggest advantage of passing by ref (efficiency) is  
> automatically lost. Even if it does not escape, it is copied to the heap  
> anyway, as you point out below.
>
>
>> What I don't like about Go's closures/addresses-to-locals and D's  
>> delegates is that stuff is heap-allocated implicitly and by default. Go  
>> has even gone (sorry) as far as allocating copies *every* time the  
>> address of a local is taken.
>
> Exactly. (Though D won't do the copy if it can prove that the delegate  
> does not escape.)
>
>
>> That reminds me of the argument about "new" being necessary for classes  
>> because it makes the heap allocation explicit. It is difficult to say  
>> good-bye to "new" but at the same time we are somehow happy with  
>> implicitly allocated closures.
>
> I think that implicitly allocated closures are a lot less common than  
> passing a local by reference.

IIRC there was some keyword (is that static?) that forces a closure NOT to  
allocate on heap.

I think I'll add an optional parameter that lists all the heap-allocated  
closures to ddmd (similar to how -vtls works).


More information about the Digitalmars-d mailing list