Array literals MUST be immutable.
Michel Fortin
michel.fortin at michelf.com
Thu Feb 18 07:42:16 PST 2010
On 2010-02-18 08:00:55 -0500, Don <nospam at nospam.com> said:
>> I agree the performance is terrible because of the often unnecessary
>> heap allocation.
>
> It's not just the heap allocation. The values are also recalculated.
Well, in the case of a constant literal expression they don't need to
be recalculated, they could exist in the static data segment. If a
constant array literal is assigned to an immutable array they don't
even need to be copied. I trust the compiler will eventually do that
(and sooner the better).
>> But assigning a literal to an immutable array should be easy to
>> special-case in the compiler so that it doesn't do an unnecessary copy.
>
> Yes, but that doesn't work in the general case. It cannot be done for
> anonymous literals.
I'm not sure what you mean by "anonymous literals". Aren't all literals
anonymous?
> Also you can't force an array literal to be CTFEd.
I think that's a more general problem with CTFE. But you can force CTFE
using an enum:
enum value = ctfeFunction();
Wrap that in a template if you want more convenience:
template ctfe(alias ctfeValue) {
enum ctfe = ctfeValue;
}
auto variable = ctfe!(ctfeFunction());
>> Also, they're quite useful. How would you write the code above without them?
>>
>> int[] array;
>> array.length = 3;
>> array[0] = x;
>> array[1] = y;
>> array[2] = z;
>
> Including the library implementation:
>
> T[] toArray(T)(T[] values...)
> {
> return values.dup;
> }
>
> int[] array = toArray(x,y,z);
>
> Mutable array literals achieve almost nothing.
But now, how can the compiler optimize this and stack-allocate your
array when it detect doesn't escape your function? You're explicitly
telling it to duplicate it, even the compiler could decide it's not
necessary. (I know stack-allocation isn't implemented, but Walter said
it could be done.)
Consider this case:
int a, b, c;
int[] array;
array ~= [a, b, c];
array ~= toArray(a, b, c);
Does it make sense to heap-allocate the mutable array? Hardly. With the
literal, the compiler is free to optimize away the heap allocation, not
so with toArray.
--
Michel Fortin
michel.fortin at michelf.com
http://michelf.com/
More information about the Digitalmars-d
mailing list