scope class members -> in-situ
Bill Baxter
wbaxter at gmail.com
Fri Oct 2 09:02:44 PDT 2009
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.
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()).
--bb
More information about the Digitalmars-d
mailing list