Array literals' default type

Don nospam at nospam.com
Fri Oct 9 05:34:31 PDT 2009


Steven Schveighoffer wrote:
> On Fri, 09 Oct 2009 06:11:50 -0400, grauzone <none at example.net> wrote:
> 
>> Steven Schveighoffer wrote:
>>> immutable(double)[] - The compiler stores a copy of this array 
>>> somewhere in ROM and initializes the stack variable with the 
>>> immutable pointer to the data.
>>
>>
>> And what about
>>
>> void foo(int x) {
>>     auto a = [1, x, 2];
>>
>> ?
>>
>> Should it create an immutable array on the heap? And if the user 
>> happens to need a mutable one, he has to dup it? (Causing one 
>> unnecessary memory allocation.)
> 
> This is an interesting question.  This literal obviously cannot be 
> ROM-allocated, so it must be heap allocated.  But do we want heap 
> allocated literals forced into being immutable?
> 
> I think array literals need to go through a major overhaul.  The type of 
> the literal is highly dependent on both how you want to use it, and the 
> values given to it.  Similar to how a 1 can be interpreted as a byte, 
> maybe an array literal needs to generate different code depending on how 
> you assign it.
> 
> Here's a stab at some rules I'd like to see implemented (when I say 
> assigned to variable, I mean assigned, or casted, or passed as argument, 
> etc):
> 
> 1. If an array literal is assigned to a variable of type immutable(T)[] 
> or const(T)[]:
>    a. If any of the elements of the array are runtime-decided, then the 
> array is allocated on the heap.
>    b. Otherwise, the array is set in ROM, and an alias to the array is 
> returned.
> 2. If an array literal is assigned to a variable of type T[] where T is 
> not immutable or const, it is *always* allocated on the heap.
> 3. If an array literal is assigned to a variable of type T[], and all of 
> the elements can be either interpreted as type T or implicitly casted to 
> type T, the literal shall be interpreted as if it were written 
> [cast(T)e1, cast(T)e2, ...]
> 4. If an array literal is assigned to a variable with the auto 
> specifier, the type is immutable(T) where T is the most basic type that 
> all the elements can be interpreted as.  Then rule 1 is followed.
> 5. If an array literal is assigned to a variable that is a static array, 
> no heap allocation shall occur.
> 6. If an array literal is .dup'd, it will be treated as if it were 
> assigned to a T[] where T is mutable.  If it's assigned to an auto, then 
> T is the most basic type that all elements can be interpreted as.
> 7. If an array literal is .idup'd, it will be treated as if it were 
> assigned to an immutable(T)[].  If it's assigned to an auto, then T is 
> the most basic type that all elements can be interpreted as.
> 
> I suck at writing rules :)  Here are some examples of what I think 
> should happen, and the types interpreted:
> 
> int[] x = [1,2,3]; // type: int[], on heap.
> auto x = [1,2,3]; // type: immutable(int)[], ROM.
> 
> int y = 2;
> 
> auto x = [1,y,3]; // type: immutable(int)[], heap.
> int[] x = [1,y,3]; // type: int[], heap.
> 
> auto x = [1,y,3].dup; // type int[], heap, only one allocation.
> auto x = [1,2,3].dup; // type: int[], heap, only one allocation.
> 
> auto x = [1,y,3].idup; // type: immutable(int)[], heap, only one 
> allocation.
> auto x = [1,2,3].idup; // type: immutable(int)[], ROM.
> 
> auto x = [1,2.2,3]; // type: immutable(double)[], ROM.
> immutable(double) x = [1,2,3]; // type: immutable(double)[], ROM.
> 
> int[3] x = [1,2,3]; // type int[3u], on stack, no heap allocation.
> 
> auto x = "hello"; // type immutable(char)[], ROM.
> char[] x = "hello"; // type char[], on heap.
> 
> This is all principal of least surprise.  Do people think this is a good 
> idea?
> 
>> (Wait, is .dup even enough to get a mutable array, or will it return 
>> just another immutable one?)
> 
> .dup always returns a mutable array, regardless of the immutability of 
> the source.  .idup returns an array of immutable data.
> 
>> int[3] a = [1, x, 2];
>>
>> Ideally, the line of code above would not cause a heap allocation.
> 
> I agree.  Automatic heap allocations for array literals that don't need 
> to be heap allocated is crappy.
> 
> -Steve

I don't understand why runtime-determined array literals even exist.
They're not literals!!!
They cause no end of trouble. IMHO we'd be *much* better off without them.





More information about the Digitalmars-d mailing list