On Sat, 25 Dec 2010 14:42:48 -0000, bearophile <bearophileh...@lycos.com> wrote:

spir:

I would enjoy to see a concrete, meaningful, example.

Often enough my class/struct members are arrays, and often I'd like the compiler to help me be more sure their memory is not shared (with a slice, for example) with something outside the instance. See below.


It seems your point is to avoid sharing ref'ed elements --which is precisely the purpose of referencing, isn't it?

That's one of the purposes of references, but there are other purposes. A dynamic array is allocated on the heap through a kind of fat reference so you are able to change its length. Objects in D are always managed by reference, so you have no choice.


What is the sense of having referenced elements if the references are not to be shared?

They are owned by the class instance :-) And even if you use emplace or scoped from Phobos, you still have a reference, so @owned is useful even for scoped objects.


Then, you would need a tag like @owned to give back value semantics to referenced elements... Correct?

@owned doesn't change the semantics and probably the resulting binary is unchanged. Its purpose is just to disable certain undesired (and buggy) behaviours, to keep class instance the only owner of the referenced object/array.


What about the opposite (much rarer) case:

It's another thing.


Googling should point you to 2-3 articles by Bertrand Meyer

I remember something by Meyer, but I don't remember if he was talking about instance ownership. I will read something again.

Bye,
bearophile

I don' understand how this can be implemented in more complicated cases:

class X {
     @owned private int[] foo;
     int[] f1() {
        auto fooSlice = foo[0...3];                 // is this valid?
        someExternalFunc(foo);                      // is this allowed?
        someExternalFunc(fooSlice)                  // how about this?
        return someFuncReturningArrayArg(fooSlice); // how to detect this?
    }
}

It seems that @owned can work only in very primitive cases - otherwise complex escape analysis needed, and I even do not know if it will help. May be, if only pure function will be allowed to accept @owned arguments, it will be ok, but power of this feature will be
severely limited in this case.

Reply via email to