On Saturday, 11 April 2015 at 09:28:46 UTC, Marc Schütz wrote:
On Friday, 10 April 2015 at 23:12:55 UTC, deadalnix wrote:
On Friday, 10 April 2015 at 10:02:01 UTC, Martin Nowak wrote:
On Wednesday, 8 April 2015 at 23:11:08 UTC, Walter Bright wrote:
http://wiki.dlang.org/DIP77

So someone passes an RCO via ref to avoid the inc/dec, and because that imposes safety issues we turn it into some sort of pass by value under the hood, defeating the purpose, and provide an opt-out via @system opAssign.

Wouldn't it more straightforward to make pass-by-ref unsafe (@system) for RCOs?

Then the only thing missing to make this equally powerful, would be an optimization opportunity for the compiler to elide copies of pass-by-value RCOs, e.g. it could avoid calling the postblit when the function retains the refcount.

Only the first pass by ref create a copy. You can then pass the ref down all you want without copy.

That is an acceptable cost IMO.

It's not acceptable that it happens behind the user's back. Costly operations must be explicit.

If we somehow know for a fact that the object really is a reference counted object, then the cost should be acceptable. Running the postblit will consist of incrementing a reference count and nothing else. There's no other way I can think of that permits passing the object safely.

I think the one thing in the DIP I'm not sure of is the definition of what is a reference counted object. Say you write this.

struct Widget {
    byte* data;
    size_t length;

    @trusted
    opAssign(ref const(Widget) other) {
        length = other.length;

        data = malloc(length);
        memcpy(cast(void*) data, cast(void*) other.data, length);
    }

    @trusted
    this(this) {
        auto oldData = data;

        data = malloc(length);
        memcpy(cast(void*) data, cast(void*) oldData, length);
    }

    @trusted
    ~this() {
        free(data);
    }
}

Why would you want to do this? Who knows. According to DIP77 the object above is defined to be a reference counted object, when it isn't. If we're rejecting the C++ answer of "don't write code that way," then the same rejection should apply here. We need to be able to say with 100% certainty that we are dealing with a reference counted object, or at least an object where we know the postblit is so trivial the cost of calling it will be small.

Reply via email to