Why are scope variables being deprecated?
Don Clugston
dac at nospam.com
Thu Oct 11 06:22:47 PDT 2012
On 11/10/12 02:30, Piotr Szturmaj wrote:
> Jonathan M Davis wrote:
>> On Thursday, October 11, 2012 01:24:40 Piotr Szturmaj wrote:
>>> Could you give me an example of preventing closure allocation? I think I
>>> knew one but I don't remember now...
>>
>> Any time that a delegate parameter is marked as scope, the compiler
>> will skip
>> allocating a closure. Otherwise, it has to copy the stack from the
>> caller onto
>> the heap to create a closure so that the delegate will continue to
>> work once
>> the caller has completed (e.g. if the delegate were saved for a
>> callback and
>> then called way later in the program). Otherwise, it would refer to an
>> invalid
>> stack and really nasty things would happen when the delegate was
>> called later.
> >
>> By marking the delegate as scope, you're telling the compiler that it
>> will not
>> escape the function that it's being passed to, so the compiler then
>> knows that
>> the stack that it refers to will be valid for the duration of that
>> delegate's
>> existence, so it knows that a closure is not required, so it doesn't
>> allocate
>> it, gaining you efficiency.
>
> Thanks, that's clear now, but I found a bug:
>
> __gshared void delegate() global;
>
> void dgtest(scope void delegate() dg)
> {
> global = dg; // compiles
> }
>
> void dguse()
> {
> int i;
> dgtest({ writeln(i++); });
> }
>
> I guess it's a known one.
Looks like bug 5270?
More information about the Digitalmars-d-learn
mailing list