The great slice debate -- should slices be separated from arrays?

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Tue Nov 24 11:07:27 PST 2009


Steven Schveighoffer wrote:
> On Tue, 24 Nov 2009 11:07:43 -0500, Andrei Alexandrescu 
> <SeeWebsiteForEmail at erdani.org> wrote:
> 
>> Steven Schveighoffer wrote:
>>> In many other posts, people have been festering over dropping T[new] 
>>> and not having a reference array type.  The argument is (and forgive 
>>> me if this is a strawman, someone from the other side can post if I'm 
>>> incorrect): If we make arrays a separate type from slices, and only 
>>> allow appending on arrays, then we solve the stomping problem and the 
>>> hard-to-determine reallocating problem.  For those who are unfamiliar 
>>> with these problems, I'll try to outline them at the bottom of the post.
>>>  I contend that even if we make arrays a separate type, even if 
>>> arrays are made a true reference type, slices will still suffer from 
>>> the same hard-to-determine reallocation problem *unless* we make 
>>> slices fatter.
>>>  My proof is as simple as an example.  Assume 'Array' is the new type 
>>> for an array:
>>>  auto a = new Array!(int)(15); // allocate an array of 15 integers, 
>>> all 0
>>> auto s = a[0..5];
>>> a ~= [1,2,3,4,5];
>>> a[0] = 1.
>>>  Now, what does s[0] equal?
>>
>> Array may include a field
>>
>>     bool sliceExtracted;
>>
>> that is set to true whenever you take a slice from the array and set 
>> to false whenever the array's data is reallocated. The array's 
>> documentation could mention that ~= is amortized constant if there are 
>> no intervening slicing operations.
> 
> We weren't talking about performance, but I think I know what you are 
> saying: To solve the hard-to-determine reallocation problem, you propose 
> that any array which has had a slice taken from it, will reallocate on 
> append even if it could grow into the block?  That seems like a rather 
> blunt solution...
> 
> if(arr[0.."hello".length] == "hello")
>    arr ~= "xyz"; // oops, reallocate because we took a slice earlier.
> 
> Wouldn't this make slicing combined with appending unusable for 
> performance reasons?  Then the only time you want to use slices is if 
> you are done appending to the array, and then even today's 
> implementation wouldn't cause the hard-to-determine problem for code 
> written that way.
> 
> Maybe I misunderstood you, let me know.

You understood me correctly. I think it's reasonable if Array defines ~= 
in relation to using other primitives. It's a common approach, for 
example, in C++ and Java to define an operation (such as bumping or 
dereferencing an iterator) in terms of no intervening conflicting 
operations against the same object.


Andrei



More information about the Digitalmars-d mailing list