Walter Bright Wrote:
> http://www.reddit.com/r/programming/comments/9fk6g/how_nested_functions_work_part_1/
I really like the way nested functions and closures are done in D. Especially
because they are the same thing as delegate and closures.
But speaking of closures, I did notice something that could be optimized:
void foo {
int a;
void foo2() { a++;}
bar(&foo2);
}
void bar(in void delegate() dg) { dg(); }
Here foo() is using _d_allocmemory to get storage for the stack frame. I
understand it is for cases where the closure is executed long after the owner
method has returned, but if the delegate has a scope storage class it could use
the thread's stack instead.
Using nested functions alone does use the stack for storage, unless you need to
use a local delegate to fix forward references within nested functions
resulting in _d_allocmemory allocating the stack frame, as in the following
example:
void myFoo() {
int a;
scope void delegate() bar = void;
void foo() { bar(); }
void foo2() { a++; if(a != 10) foo(); }
bar = &foo2;
foo();
}
Closures in D is an amazing feature and I really miss it when I need to use
another language (I can't find an employer who wants D code, but I keep my
fingers crossed!), but here is yet another feature I try to avoid in time
critical code right now because of the expensive call into the memory manager
when I can write longer code that executes on stack storage.
Anywho, thanks for the link Walter, I'm not really familiar with C# and it's
nice to know D beats its syntax, I would hate to have to assign delegates for
every nested function!