On Tue, 08 Mar 2011 16:53:08 -0500, Ali Çehreli <acehr...@yahoo.com> wrote:

On 03/08/2011 01:34 PM, Tom wrote:
import std.stdio;

struct S {
int i;
int j;
}

int main(string[] args) {
S[] ss = void;
ss.length = 5;
foreach (ref s; ss)
s = S(1, 2);
return 0;
}

Is the above code correct? (it doesn't work... it blows away or just
give and access violation error).

I need to create a dynamic array of some struct, but don't want defer
contained elements initialization (for performance reasons).

Tom;

There is std.array.reserve:

import std.array;

struct S {
     int i;
     int j;
}

int main(string[] args) {
     S[] ss;
     reserve(ss, 5);

     // or if you want to confuse yourself (and me):
     ss.reserve(5);  // same thing as above

     foreach (ref s; ss)
         s = S(1, 2);

     return 0;
}

Some clarifications:

it's not std.array.reserve, it's object.reserve, always present, no need to import.

I believe if the type contains pointers the GC still writes 0s to the unused data to prevent false pointers. However, reserve on an int or a struct that just contains ints should not pre-initialize.

reserve ensures appropriate space for appending, it does *not* alter the array's length. So your foreach loop would not execute (at that point, ss.length is still 0).

To work properly, you would need to use the append operator.

Bearophile has requested an ability to create a dynamic array uninitialized, and I think there is a bug report for that. Currently, there is no "easy way" to do it.

-Steve

Reply via email to