scope class members -> in-situ

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Fri Oct 2 09:23:55 PDT 2009


Bill Baxter wrote:
> On Fri, Oct 2, 2009 at 8:33 AM, Andrei Alexandrescu
> <SeeWebsiteForEmail at erdani.org> wrote:
>> I think this has been discussed in this group already.
>>
>> An object storing another object needs two allocations:
>>
>> class A { ... }
>> class B {
>>   A a;
>>   this() {
>>      a = new A;
>>   }
>> }
>>
>> auto b = new B; // two allocations
>>
>> I'm thinking of using "scope" in this situation to imply in-situ storage:
>>
>> class B {
>>   scope A a;
>>   this() {
>>      a = new A;
>>   }
>> }
>>
>> Now the A member actually lies inside of B - no more indirection. That means
>> the constructor needs special scrutiny, in particular a cannot be null
>> because that wouldn't make much sense.
>>
>> What do you think?
> 
> I think it would be nice, but there are enough issues that I'm not
> convinced that saving a few allocations is worth it.
> 
> Mainly what happens if you do   someB.a = someOtherA  later on?
> 
> The answer to that might be different than how you treat  someB.a = new A().
> 
> The latter could be converted into a placement new.   But the former
> has to still point to the original someOtherA to maintain proper
> reference semantics.
> 
> You can sidestep these issues by saying that a scope A in a class is
> not rebindable.  But that no doubt cuts out some useful cases.

Yah, the idea was to make it not rebindable. Initially I even thought of 
using "final" instead of "scope".

> Another option would be to make "scope A" reserve space for both a
> pointer to an A and the memory for it.  Then the someB.a is just a
> regular A reference that can be rebound like any other, or made null
> if desired.  It would just leave orphaned memory sitting there if
> rebound to point to some other A.   Or it could use placement
> construction if you assign a new A to it.   (but not if you say
> someB.a = new DerivedFromA()).

Having a reference plus in-situ storage also crossed my mind, but I 
think it would serve corner cases that could best be served by either 
using two allocations, or having the user herself define one reference + 
one scope object.


Andrei



More information about the Digitalmars-d mailing list