Thread overview | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
August 20, 2014 delegates & GC allocations | ||||
---|---|---|---|---|
| ||||
I've been hearing that delegates get a context pointer which will be allocated on the GC. Is this also true for delegates which stay in scope? e.g. void addThree() { int val; void addOne() { val++; } addOne(); addOne(); addOne(); return val; } Will the above function allocate on the GC? |
August 20, 2014 Re: delegates & GC allocations | ||||
---|---|---|---|---|
| ||||
Posted in reply to Etienne Attachments: | On Wed, 20 Aug 2014 10:44:38 -0400 Etienne via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com> wrote: > Will the above function allocate on the GC? no. |
August 20, 2014 Re: delegates & GC allocations | ||||
---|---|---|---|---|
| ||||
Posted in reply to Etienne Attachments: | On Wed, 20 Aug 2014 10:44:38 -0400 Etienne via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com> wrote: and this is not delegate, this is just nested function. |
August 20, 2014 Re: delegates & GC allocations | ||||
---|---|---|---|---|
| ||||
Posted in reply to ketmar | On Wednesday, 20 August 2014 at 14:54:31 UTC, ketmar via Digitalmars-d-learn wrote:
> On Wed, 20 Aug 2014 10:44:38 -0400
> Etienne via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com>
> wrote:
>
> and this is not delegate, this is just nested function.
non-static nested functions are effectively delegates as it needs a context pointer to parent stack frame. However, not every delegate is a closure - heap allocation of the context happens only if delegate leaves the scope it refers to (via return value or by being passed as an argument to external function)
|
August 20, 2014 Re: delegates & GC allocations | ||||
---|---|---|---|---|
| ||||
Posted in reply to Dicebot | > non-static nested functions are effectively delegates as it needs a context pointer to parent stack frame.
Only if it is recursive.
|
August 20, 2014 Re: delegates & GC allocations | ||||
---|---|---|---|---|
| ||||
Posted in reply to Etienne | On Wednesday, 20 August 2014 at 14:44:39 UTC, Etienne wrote:
> I've been hearing that delegates get a context pointer which will be allocated on the GC. Is this also true for delegates which stay in scope?
>
> e.g.
>
> void addThree() {
> int val;
> void addOne() {
> val++;
> }
>
> addOne();
> addOne();
> addOne();
>
> return val;
> }
>
> Will the above function allocate on the GC?
int getInt1() @nogc
{
int val;
int func() @nogc { return val; }
return func();
}
int delegate() getInt2() //@nogc - thie one allocates!
{
int val;
int func() @nogc { return val; }
return &func;
}
int delegate() getInt3() @nogc
{
int val;
int func() @nogc { return 0; }
return &func;
}
|
August 20, 2014 Re: delegates & GC allocations | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ola Fosheim Gr | On Wednesday, 20 August 2014 at 15:17:52 UTC, Ola Fosheim Gr wrote:
>> non-static nested functions are effectively delegates as it needs a context pointer to parent stack frame.
>
> Only if it is recursive.
Or if it refers to any state of the parent function.
|
August 20, 2014 Re: delegates & GC allocations | ||||
---|---|---|---|---|
| ||||
Posted in reply to Chris Nicholson-Sauls | On Wednesday, 20 August 2014 at 20:48:38 UTC, Chris Nicholson-Sauls wrote:
> On Wednesday, 20 August 2014 at 15:17:52 UTC, Ola Fosheim Gr wrote:
>>> non-static nested functions are effectively delegates as it needs a context pointer to parent stack frame.
>>
>> Only if it is recursive.
>
> Or if it refers to any state of the parent function.
As long as the compiler knows where it will be called from it should be able use a stack pointer offset (unless alloca gets in the way) without the frame pointer of the parent.
|
August 20, 2014 Re: delegates & GC allocations | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ola Fosheim Gr | On Wednesday, 20 August 2014 at 21:19:18 UTC, Ola Fosheim Gr wrote:
> On Wednesday, 20 August 2014 at 20:48:38 UTC, Chris Nicholson-Sauls wrote:
>> On Wednesday, 20 August 2014 at 15:17:52 UTC, Ola Fosheim Gr wrote:
>>> Only if it is recursive.
>>
>> Or if it refers to any state of the parent function.
>
> As long as the compiler knows where it will be called from it should be able use a stack pointer offset (unless alloca gets in the way) without the frame pointer of the parent.
Well, I guess simple recursion could be solved easily too by having a wrapper function that puts the frame pointer in a free callee save register...
|
August 20, 2014 Re: delegates & GC allocations | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ola Fosheim Gr | On 2014-08-20 5:25 PM, Ola Fosheim Gr wrote:
>
> Well, I guess simple recursion could be solved easily too by having a
> wrapper function that puts the frame pointer in a free callee save
> register...
So, my question inspired a new optimization? :-p
|
Copyright © 1999-2021 by the D Language Foundation