D array expansion and non-deterministic re-allocation
Denis Koroskin
2korden at gmail.com
Thu Nov 19 04:32:03 PST 2009
On Thu, 19 Nov 2009 14:56:40 +0300, Steven Schveighoffer
<schveiguy at yahoo.com> wrote:
> On Wed, 18 Nov 2009 13:21:49 -0500, Bartosz Milewski
> <bartosz-nospam at relisoft.com> wrote:
>
>> Andrei Alexandrescu Wrote:
>>
>>> Leandro Lucarella wrote:
>>> > Andrei Alexandrescu, el 17 de noviembre a las 18:45 me escribiste:
>>> >>> 3. If you **really** care about performance, you should only
>>> append when you
>>> >>> don't know the length in advance. If you know the length, you
>>> should always
>>> >>> pre-allocate.
>>> >> We will have collections and all those good things, but I don't see
>>> >> how the proposal follows from the feedback. My perception is that
>>> >> this is a group of people who use D. Bartosz' concern didn't cause
>>> >> quite a riot, so as far as I can tell there is no big issue at
>>> >> stake.
>>> >
>>> > I didn't say anything (until now) because this was discussed already.
>>> > Dynamic arrays/slices appending is horribly broken (I know it's well
>>> > defined, and deterministic, but you are just condemned to make
>>> mistakes,
>>> > it just doesn't work as one would expect, even when you know how it
>>> works
>>> > you have to keep fighting your intuition all the time).
>>>
>>> In which ways do you think arrays horribly broken? Same as Bartosz
>>> mentions?
>>>
>>> One question is whether you actually have had bugs and problems coding,
>>> or if arrays stopped you from getting work done.
>>>
>>
>> What Leandro points out is that using D arrays is not straightforward
>> and may present a steep learning curve. In particular, even the
>> beginner would be required to understand section 4.1.9 of TDPL
>> (Expanding). For many people arrays' behavior might be
>> counter-intuitive and a source of mistakes.
>>
>> In fact, even after reading 4.1.9 I don't know what to expect in some
>> cases. Here's an example:
>>
>> int[] a = [0];
>> auto b = a;
>> a ~= 1;
>> b ~= 2;
>> What is a[1]?
>>
>> Is this considered "stomping" and requiring a re-allocation?
>
> a[1] would be 1 if an MRU cache was introduced. This is exactly the
> sort of problem that the MRU cache is supposed to solve.
>
> What should happen is:
>
> a ~= 1 should allocate in place because its parameters were in the MRU
> cache.
> b ~= 1 should reallocate because the a~=1 should have removed its
> parameters from the MRU cache.
>
> I agree that arrays behave differently than what people naively expect.
> However, their usage is so much better than anything from other
> languages I've used. One of the biggest "problems" in understanding
> arrays I've found from having to explain them to other people is that
> they are half value type and half reference type. I'd say most of the
> confusion comes from that, but it's that feature that makes them so
> great IMO. I'm unsure whether introducing a different usage would leave
> them as great, but I hope we can find a way to make them intuitive *and*
> keep them as useful as they are now.
>
> The implementation-defined determinisim is probably another issue that
> bites people, but I think the cases are so much rarer. Generally when
> you are appending *and* manipulating the original data, you have a
> unique array. Otherwise your usage falls into either read-only + append
> usage, or buffer usage where you don't usually append. Data-stomping is
> a memory issue (and a const/invariant issue), so I think that needs the
> most immediate attention. If it can be solved without changing the
> syntax or system, then I think it's a win-win. We can always decide to
> use a new concept later if we want to fix the deterministic behavior.
>
> In fact, how hard would it be to introduce a deterministic construct
> *without* changing current behavior? I mean, if the end result of your
> proposal is you add something like std::vector, why not still allow
> appending to slices *and* add something like std::vector where people
> can use that if they want better behavior?
>
> -Steve
Slices are ranges. And ranges are *shrink-only*. Are you going to append
to your data structure? Use an Array instead. Slices are not suitable for
that purpose!
More information about the Digitalmars-d
mailing list