Franciszek Czekala <[email protected]> wrote:
What part of stack frame is exactly copied when a delegate is used?
Generally, only the used variables.
You can check the size of the closure's stack copy using
GC.sizeOf(dg.ptr).
For example what is the heap usage due to delegates usage in the
following code?
Adding this code to the end of it:
int n = 0;
void* ptr = null;
foreach ( e; dlg ) {
if ( e.ptr != ptr ) {
ptr = e.ptr;
n += GC.sizeOf( e.ptr );
}
}
writeln( n );
We can see that 1600 bytes are used.
The library reference speaks about the enclosing function but I do not
think
that it suffices to copy the stack frame of the directly enclosing
function.
Is the whole stack copied?
All enclosing functions need to have their stack frames copied. That is,
not the whole stack, but any functions for which the delegate would be a
nested function.
What happens in the case of recursive calls?
int recurse( int delegate() dg ) {
int n = 1;
return GC.sizeOf( dg.ptr ) + ( dg() ? recurse( { return dg() - n; } )
: 0 );
}
void main(){
writeln( recurse( { return 100; } ) );
}
Outputs 1600.
--
Simen