On 04/03/2014 09:23 AM, dnspies wrote:
On Thursday, 3 April 2014 at 07:16:53 UTC, simendsjo wrote:
On 04/03/2014 09:03 AM, dnspies wrote:
If two dynamic arrays point to the same place in memory, is it fast to
compare them for equality? or does every element still have to be
compared?

Equals will first check for memory location.
This is from the runtime:

bool opEquals(Object lhs, Object rhs)
{
    // If aliased to the same object or both null => equal
    if (lhs is rhs) return true;

    // If either is null => non-equal
    if (lhs is null || rhs is null) return false;

    // If same exact type => one call to method opEquals
    if (typeid(lhs) is typeid(rhs) || typeid(lhs).opEquals(typeid(rhs)))
        return lhs.opEquals(rhs);

    // General case => symmetric calls to method opEquals
    return lhs.opEquals(rhs) && rhs.opEquals(lhs);
}

But this only applies to objects with a class type.  A dynamic array
isn't an object with a class type, it's a builtin type. Does it use this
opEquals?  Can a dynamic array even be cast to an Object?  I don't see
that "lhs is rhs" will return true since the array startptr-length pairs
may still occupy different places in memory even if the contents of
those arrays occupy the same place.

If the arrays have different lengths, they are obviously not equal.
Here's a quick test of the semantics of is on arrays.

    auto a = [1, 2];
    auto b = a;
    assert(a is b);
    b = a[0..$];
    assert(a is b);
    b = a[0..1];
    assert(a !is b);
    assert(a.ptr == b.ptr);

Reply via email to