T[new]

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Mon Aug 10 12:21:48 PDT 2009


Steven Schveighoffer wrote:
> On Mon, 10 Aug 2009 14:38:24 -0400, Stewart Gordon <smjg_1998 at yahoo.com> 
> wrote:
> 
>> Since nobody's yet asked....
>>
>> What type would .dup and .idup return?
>>
>> The best choice I can see is to make .dup return T[new] and .idup 
>> return invariant(T)[].
> 
> This brings up another question.  Should something like 
> immutable(T)[new] or const(T)[new] be even valid?  Consider this:
> 
> immutable(char)[new] str = "hello".idup; // not sure how you convert a 
> literal to an array, but assume it works for now.
> 
> assert(str.capacity == 16); // assume GC still allocates 16 minimum blocks
> str ~= " there";
> 
> auto slice = str[5..$];
> 
> str.length = 5;
> 
> str ~= " world";
> 
> assert(slice == " there"); // fails?
> 
> We most likely have the same issue here with immutable data as we do 
> today, just not as obvious.  Although it's a corner case, it does 
> violate immutability without casts.
> 
> There are several options:
> 
> 1. immutable(T)[new] and const(T)[new] are invalid.  This limits us more 
> than the current regime, but is a questionable construct to begin with, 
> considering it allows appending in place (you can always create a new 
> array with concatenation).
> 2. immutable(T)[new] and const(T)[new] are equivalent to 
> immutable(T[new]) and const(T[new]) respectively.  This simplifies 
> generic programming and still prevents abuses.
> 3. when you shrink an array of immutable/const elements' length, the 
> capacity automatically shrinks to prevent overwriting previous data.  
> This still leaves mutable data with the overwrite problem, but it 
> doesn't violate const.
> 4. same as #3 but do it for both immutable or mutable arrays.
> 
> Also, implicit casting to const needs to be addressed, normally you 
> can't do this with templated types (if that's how the underlying type is 
> implemented).

I think 1 is a good option. Essentially you can't have a resizeable 
array of immutable data. Functional languages don't have such a thing. 
If we go for (3), code that looks tighter is in fact more wasteful as 
every shrinking+expanding cycle causes a new allocation and a copy.


Andrei



More information about the Digitalmars-d mailing list