Re: delegates GC allocations
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. signature.asc Description: PGP signature
Re: delegates GC allocations
non-static nested functions are effectively delegates as it needs a context pointer to parent stack frame. Only if it is recursive.
Re: delegates GC allocations
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; }
Re: delegates GC allocations
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.
Re: delegates GC allocations
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.
Re: delegates GC allocations
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...
Re: delegates GC allocations
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
Re: delegates GC allocations
On Wednesday, 20 August 2014 at 21:30:41 UTC, Etienne wrote: So, my question inspired a new optimization? :-p A decent optimizing compiler would detect that the function is calling itself and save stack space by using register where possible...