www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Add GC-free closures to D, similar to the ones C++ has

reply James Lu <jamtlu gmail.com> writes:
Add GC-free closures to D. Less GC reliance means less memory 
fragmentation, enabling lower-level uses of D to use closures.

This has precedent in C blocks and in C++'s lambdas.
Sep 05
next sibling parent reply James Lu <jamtlu gmail.com> writes:
On Thursday, 5 September 2019 at 14:46:08 UTC, James Lu wrote:
 Add GC-free closures to D. Less GC reliance means less memory 
 fragmentation, enabling lower-level uses of D to use closures.

 This has precedent in C blocks and in C++'s lambdas.
The first question should be, does the current closure semantics support GC-free deallocation?
Sep 05
parent Kagamin <spam here.lot> writes:
On Thursday, 5 September 2019 at 14:50:31 UTC, James Lu wrote:
 The first question should be, does the current closure 
 semantics support GC-free deallocation?
AFAIK, closure is allocated with _d_allocatememory hook. If you override it, you can use your preferred allocator there.
Sep 08
prev sibling parent reply a11e99z <black80 bk.ru> writes:
On Thursday, 5 September 2019 at 14:46:08 UTC, James Lu wrote:
 Add GC-free closures to D. Less GC reliance means less memory 
 fragmentation, enabling lower-level uses of D to use closures.

 This has precedent in C blocks and in C++'s lambdas.
1)
 import std;

 auto mul(R)( R r, int n) /* nogc*/ {
     // simple GCed version
     return r.map!( e => e*n);
 
     // more complicated but noGC version
     //return zip( r, n.repeat).map!( z => z[0]*z[1]);
 }
 
 void main() {
     iota( 0, 10).mul( 5).writeln;
 }
2) lambda can capture something that stored in GC memory(array,AA,class,new struct,..) so for right working (GC:mark/scan) lambda also should be allocated in GC memory. (opposite: RCed-lambda, emplace, GC.addRange/remove)
Sep 05
parent a11e99z <black80 bk.ru> writes:
On Thursday, 5 September 2019 at 15:17:04 UTC, a11e99z wrote:
 On Thursday, 5 September 2019 at 14:46:08 UTC, James Lu wrote:
 Add GC-free closures to D. Less GC reliance means less memory 
 fragmentation, enabling lower-level uses of D to use closures.

     // more complicated but noGC version
     //return zip( r, n.repeat).map!( z => z[0]*z[1]);
more complicated visually and thoughtful but machine code probably simpler and faster
Sep 05