On Mon, 03 Jun 2013 23:38:12 -0400, Peter Williams <pwil3...@bigpond.net.au> wrote:

On 04/06/13 11:56, Steven Schveighoffer wrote:
On Mon, 03 Jun 2013 20:06:14 -0400, Peter Williams

auto tmp = a[i + 1..$];
a.length = i;
a ~= tmp;

would be more efficient?

No, because that will also reallocate,

Wouldn't the a.length = i prevent that?

No.  The runtime specifically will reallocate on this case.

It does not know that tmp is never going to be used again, nor does it know that there aren't any other references to the data past i. It MUST reallocate to avoid stomping (in fact, prior to my changes it DID overwrite).

Case in point, if it didn't reallocate, the above would be copying tmp over itself, offset by one!

The runtime expects that when it is appending data, it is doing so into space that is currently unused. You can use assumeSafeAppend to tell it "the data after this is unused", but then it better be unused :) In your case, you are using it (via tmp), so that doesn't work.

For some reason, D doesn't support overlapping moves,

Probably because there's some instances where it would be a disaster and explaining all the cases where you can and can't becomes too difficult so it's just easier to say no to all cases.

No, memmove is valid C code and supports overlapping writes. It's not as optimized as memcpy, which does not.

But I don't know exactly what the difference is. A simple check at the beginning can determine which mode to use, memmove should devolve to memcpy if there is no overlap. And in some cases, the compiler specifically knows whether there is overlap at compile time.

-Steve

Reply via email to