== Quote from Ali Cehreli (acehr...@yahoo.com)'s article > dsimcha Wrote: > > == Quote from Bartosz Milewski (bartosz-nos...@relisoft.com)'s article > > > > int[] a = [0]; > > > > auto b = a; > > > > a ~= 1; > > > > b ~= 2; > > > > What is a[1]? > > > > > > > > Is this considered "stomping" and requiring a re-allocation? > > > Can this question be answered without the recourse to implementation, and > > > the > > MRU cache in particular? > > > I thought about an abstract definition of "stomping".Something like that: > > > The > > expanded part of the array is never implicitly shared with any other array. > > But > > I'm not sure about this case: > > > int[] a = [1, 2, 3]; > > > int[] b = a[0..1]; > > > b ~= 4; > > > what is a[1]? > > > By my definition, this would be considered stomping, but I couldn't find > > > this > > example in TDPL. > > > > a[1] == 2. The MRU cache stores both the pointer and the length. When you > > attempt to append to b, the MRU is searched. No array that starts at b.ptr > > and > > has length b.length is found. b is reallocated. > Consider there is also c: > int[] c = b[0..1]; > According to the above definition, after b~=4 'b' would be relocated and b[0] would be disjoint from c[0]. > Now consider that a's definition is changed to just [ 1 ]. > If I understand this correctly, then b.ptr and b.length would match the > original array, and in this case b ~= 4 operation might not relocate b, and b[0] and c[0] would refer to the same element. > A change in 'a' would be defining the relation between b and c. > Ali
You're right. Indexing, unlike appending provides no guarantees about stomping, except that, if none of the arrays involved are resized, then they will point to the same memory block. I don't see this as a problem in practice, because it does not break immutability guarantees, etc. I've been using D for a year and a half and never had a bug caused by that. All you need to do is follow these rules: 1. If you want a slice to point to the same memory as the original array, make sure none of the arrays are resized. 2. If you don't want a slice to point to the same memory as the original array, use .dup. 3. If you don't care either way, then do neither.