Slice allocation after appending
Steven Schveighoffer
schveiguy at gmail.com
Wed Dec 23 15:04:08 UTC 2020
On 12/22/20 5:12 PM, Rekel wrote:
> According to the D slice article
> (https://dlang.org/articles/d-array-article.html), slices do not care
> where they start, only where they end, when checking whether expanding
> in place is permitable, or at least that is what I understood regarding it.
>
> Now I'm unsure how to check this, I tried to a bit using the online
> editor and a bit of pointer usage which seemed to confirm my suspicion,
> but does this mean that taking a (small) slice at the end of a
> (possibly) very large dynamic array can lead to problematic behavior?
Problematic in what way? It will not stomp on data that is live. So I'd
say it's the opposite of problematic.
You can check whether an append will reallocate or not by checking the
capacity. If arr.capacity <= arr.length, then an append will reallocate.
> For example;
>
>> int[] a = new int[10]; // Imagine this is very large
>> int[] b = a[$-1..$]; // Small slice at the end
>> b ~= 2; // b extends, possibly in place
>> a ~= -1; // a no longer can, so the entire array needs
>> reallocating
> (instead of be reallocating & a growing in place)
For sure a will need reallocating. The runtime cannot know that you will
append with a, so it uses the space for b.
If you'd rather b reallocate, you can use the concatenation operator on
it instead:
b = b ~ 2;
Or you can manage the array allocations yourself without using the
runtime (see std.array.Appender).
>
> Again I'm not very certain I fully understood how slices are
> implemented, but is this example, and the problem I imagine it leading
> to, valid?
Is the description you have valid? yes. Is it a problem with the
implementation? I'd say no. If you change your expectations, you can
avoid this situation easily.
-Steve
More information about the Digitalmars-d-learn
mailing list