Aggregates & associations
Bruce Adams
tortoise_74 at yeah.who.co.uk
Wed Dec 19 16:39:54 PST 2007
On Wed, 19 Dec 2007 20:41:58 -0000, Sean Kelly <sean at f4.ca> wrote:
> Bruce Adams wrote:
>> On Wed, 19 Dec 2007 15:11:46 -0000, Jason House
>> <jason.james.house at gmail.com> wrote:
>>
>>> Steven Schveighoffer Wrote:
>>>
>>>> "Sean Kelly" wrote
>>>> >A long time ago Walter mentioned that the "scope" attribute may be
>>>> extended
>>>> >to indicate aggregation:
>>>> >
>>>> > class Foo
>>>> > {
>>>> > Bar valA;
>>>> > scope Baz val2;
>>>> > }
>>>> >
>>>> > With the above, the size of Foo would be expanded to contain an
>>>> instance
>>>> > of Baz and val2 would be initialized to reference this memory, very
>>>> much
>>>> > like "scope" works in functions now. But I didn't see any mention
>>>> of this
>>>> > in the D 2.0 writeup so the idea may have been either discarded or
>>>> > forgotten.
>>>>
>>>> I believe this type of behavior is not necessary. Whether a member
>>>> is an
>>>> aggregate or an association, it will be deleted when nothing
>>>> references it
>>>> anymore, which is when it should be deleted. The only thing this
>>>> proposed
>>>> behavior can do is cause segfaults when something that still has a
>>>> reference
>>>> to a scoped member tries to use it.
>>>
>>> It has more value that that. It's easy for me to imagine a scope
>>> class that includes one or more scope classes (such as a wrapper
>>> around an RAII object)
>> Also failing early can be a good thing. Attempting to use an
>> associated object that
>> is not valid is an error. Just because you have not released the memory
>> for it
>> does not make it valid. You program could give the illusion of working
>> for a bit
>> and then die mysteriously.
>> The ability to delete deterministically as an optimisation could make
>> programs more
>> efficient too. You might even be able to simplify collection sweeps or
>> switch them off
>> temporarily without compromising performance.
>
> Interestingly, if objects are constructed inside the memory reserved for
> other objects, then if one is collected by the GC it must be true that
> all other objects in the same block are free as well. Also, since they
> share memory, all the objects can safely refer to one another in their
> dtors so long as they are careful to avoid using member data that may
> already have been released. As you say, this promises to offer some
> interesting possibilities for composite objects.
>
>
> Sean
Except that at present there's no way to declare that an object is
contained in
another object except as a struct and a struct is not an object. I don't
think
scope would do this and if it did it would be ahem beyond its scope to do
so.
More information about the Digitalmars-d
mailing list