important proposal: scope keyword for class members

John Simon zildjohn01 at gmail.com
Mon Mar 9 12:14:19 PDT 2009


Denis Koroskin Wrote:

> On Sat, 07 Mar 2009 08:15:59 +0300, John Simon <zildjohn01 at gmail.com> wrote:
> 
> > I'd like to propose a new use for the 'scope' keyword within an  
> > aggregate body.
> >
> > Members of class type declared with the scope keyword are allocated not  
> > as references or pointers, but initialized directly inside the  
> > container.  Instead of a default initializer of 'null', it will  
> > initialize with the default constructor of the class, or an optional  
> > assignment after the declaration. Any 'new [type]' within the assignment  
> > will resolve to a simple call to the type's __ctor, instead of a memory  
> > allocation.
> >
> > Example:
> >
> > class Inner {
> >     this() {}
> >     this(int x) {}
> > }
> >
> > class Container {
> >     Inner i1; // initialized to null
> >     scope Inner i2; // allocated within class
> >     scope i3 = new Inner(42); // allocated within class
> >
> >     this() {
> >         // implicit i2.__ctor();
> >         // i3.__ctor(42) written above, executed here
> >         assert(i1 is null);
> >         assert(i2 !is null);
> >         i1 = new Inner;
> >     }
> >
> >     this(int overloaded) {
> >         // i2 and i3 are constructed, same as above
> >     }
> >
> >     ~this() {
> >         // implicit i2.__dtor();
> >         // implicit i3.__dtor();
> >         // i1 is still somewhere in the heap
> >     }
> > }
> >
> > IN ENGLISH:
> >
> > If it's likely that class members will be constructed with and die with  
> > the object, why not just allocate them right in the class? Save on heap  
> > fragmentation and cache misses.  I was honesetly flabberghasted when I  
> > realized there was no way to do this in D, it seems like it should be  
> > one of the most basic constructs of a C-derived (or any low-ish level)  
> > language.
> >
> > The programmer knows best where he wants his objects stored. Also, the  
> > 'scope' makes sense, and we should mirror the current behavior of the  
> > keyword in function bodies.
> 
> I belive it could be implemented in a library. Something like this (not tested):
> 
> struct Scope(T)
> {
>     static assert(is(T : class));
> 
>     private ubyte[SizeOf!(T)] _data = T.init[];
>     private bool _isConstructed = false;
> 
>     T value()
>     {
>         return cast(T)_data.ptr;
>     }
> 
>     alias this value;
> 
>     void construct(Params...)(Params params) // perhaps, could be 'this'
>     {
>         assert(!_isConstructed);
>         value.ctor(params);
>         _isConstructed = true;
>     }
> }
> 
> Usage:
> 
> class Foo {
>     this(int i) { this.i = i; }
>     int i;
>     void doSomething() { }
> }
> 
> class Bar
> {
>     Scope!(Foo) foo;
> 
>     this()
>     {
>         // optional:
>         foo.construct(42); // different syntax is also possible
>         // same as foo = new Foo(42);
> 
>         Foo f = foo; // implicit cast
>         foo.doSomething();
>         int i = foo.i;       
>     }
> }
> 

Oh man I've tried, believe me.
I couldn't figure out how to call the destructors in-place. Also, structs can't have parameter-less constructors



More information about the Digitalmars-d mailing list