Jump to page: 1 2
Thread overview
delegates & GC allocations
Aug 20, 2014
Etienne
Aug 20, 2014
ketmar
Aug 20, 2014
ketmar
Aug 20, 2014
Dicebot
Aug 20, 2014
Ola Fosheim Gr
Aug 20, 2014
Ola Fosheim Gr
Aug 20, 2014
Ola Fosheim Gr
Aug 20, 2014
Etienne
Aug 20, 2014
Ola Fosheim Gr
Aug 20, 2014
hane
August 20, 2014
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
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
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
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
> 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
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
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
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
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
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
« First   ‹ Prev
1 2