Thread overview
Initializing a fixed sized array
Jun 01, 2013
finalpatch
Jun 01, 2013
Jonathan M Davis
Jun 01, 2013
finalpatch
Jun 01, 2013
Maxim Fomin
June 01, 2013
This form is nice:

int[3] x = [1,2,3];

But it is horribly inefficient because it

1. allocates a dynamic array from the GC
2. writes 1,2,3 to the dynamic array
3. copies the 1,2,3 back to the static array

Or one can write:

int[3] x;
x[0] = 1;
x[1] = 2;
x[2] = 3;

That is a lot of typing, but also much more efficient than the first version. But if I understand correctly, each element still gets initialized to 0 before they got overwritten.

I would like to know whether we can have a way to initialize a fixed array in D like what we can do in C++.  In C++ if i write int x[3] = {1, 2, 3}; then it's done in the most optimal way, that is, simply assigning 1,2,3 to the 3 elements. no allocation, no zero fill, no excessive copy. Better, if we write const static int x[3] = {1,2,3}; then the array will be put in the read only segment of the executable and result in zero runtime overhead. However in D, static immutable int[3] x = [1,2,3]; still allocates and copies. I wonder can we have some sort of array initialization mechanism in D that is both nice and efficient?
June 01, 2013
On Saturday, June 01, 2013 08:16:47 finalpatch wrote:
> This form is nice:
> 
> int[3] x = [1,2,3];
> 
> But it is horribly inefficient because it
> 
> 1. allocates a dynamic array from the GC
> 2. writes 1,2,3 to the dynamic array
> 3. copies the 1,2,3 back to the static array

Are you sure that that still allocates? I thought that that had been fixed. If it hasn't, it will be. The issue is completely temporary and not intended to be the case long term.

Now, assuming that you're right and that still allocates, it's trivial to create a variadic function to initialize it for you by essentially generating

int[3] x;
x[0] = 1;
x[1] = 2;
x[2] = 3;

for you. So, it's easy enough to get around, but the problem should either already be fixed in the compiler, or if not, it will be at some point in the near future.

- Jonathan M Davis
June 01, 2013
Oh cool, good to know this has been fixed. You are right, I just verified with DMD 2.063 and the generated code was good! Sorry about the noise.

On Saturday, 1 June 2013 at 06:28:45 UTC, Jonathan M Davis wrote:
> Are you sure that that still allocates? I thought that that had been fixed. If
> it hasn't, it will be. The issue is completely temporary and not intended to
> be the case long term.
>
> Now, assuming that you're right and that still allocates, it's trivial to
> create a variadic function to initialize it for you by essentially generating
>
> int[3] x;
> x[0] = 1;
> x[1] = 2;
> x[2] = 3;
>
> for you. So, it's easy enough to get around, but the problem should either
> already be fixed in the compiler, or if not, it will be at some point in the
> near future.
>
> - Jonathan M Davis

June 01, 2013
On Saturday, 1 June 2013 at 06:28:45 UTC, Jonathan M Davis wrote:
> On Saturday, June 01, 2013 08:16:47 finalpatch wrote:
>> This form is nice:
>> 
>> int[3] x = [1,2,3];
>> 
>> But it is horribly inefficient because it
>> 
>> 1. allocates a dynamic array from the GC
>> 2. writes 1,2,3 to the dynamic array
>> 3. copies the 1,2,3 back to the static array
>
> Are you sure that that still allocates? I thought that that had been fixed. If
> it hasn't, it will be. The issue is completely temporary and not intended to
> be the case long term.
>
> - Jonathan M Davis

Yes, it was a bug and it was fixed. Interesting that when there
was this bug, many didn't know about it. After it was fixed,
there were (and still are) comments warning about this issue.