Re: Creating 1000 instances

2021-02-19 Thread Simen Kjærås via Digitalmars-d-learn

On Friday, 19 February 2021 at 10:02:05 UTC, Siemargl wrote:
On Friday, 19 February 2021 at 08:29:36 UTC, Ferhat Kurtulmuş 
wrote:


Since classes are reference types all instances of files will 
be the same reference of "new File()", which you probably 
don't want.


Is any differences between x and y definitions?

MyClass [] x, y;
x = new MyClass[7];

y= new MyClass[](8);


The only part of the documentation I've found that talks about 
this is here:

https://dlang.org/spec/expression.html#new_expressions

The main difference I know of comes with multidimensional arrays:

auto a = new int[4][4];
pragma(msg, typeof(a)); // Prints int[4][]
auto b = new int[][](4,4);
pragma(msg, typeof(b)); // Prints int[][]

Since the former is a dynamic array of static arrays, the first 
size parameter cannot be passed at runtime:


auto n = 4;
// Error: variable n cannot be read at compile time
auto c = new int[n][n];

But must be a compiletime constant:

enum N = 4;
auto d = new int[N][n];
pragma(msg, typeof(d)); // Prints int[4][]

The other syntax however, can take runtime values, but does not 
encode the size in the type:


auto e = new int[][](n,n);
pragma(msg, typeof(e)); // Prints int[][]

The other big thing about the []() syntax is it actually 
initializes the arrays of arrays for you:


assert(e[0].length == n);

If you were to use new int[][n], you would need to initialize 
each array of arrays manually:


auto f = new int[][n];
assert(f[0].length == 0); // it's empty
foreach (i; 0..n) {
f[i] = new int[n]; // Have to do this yourself.
}

--
  Simen


Re: Creating 1000 instances

2021-02-19 Thread Ferhat Kurtulmuş via Digitalmars-d-learn

On Friday, 19 February 2021 at 10:02:05 UTC, Siemargl wrote:
On Friday, 19 February 2021 at 08:29:36 UTC, Ferhat Kurtulmuş 
wrote:


Since classes are reference types all instances of files will 
be the same reference of "new File()", which you probably 
don't want.


Is any differences between x and y definitions?

MyClass [] x, y;
x = new MyClass[7];

y= new MyClass[](8);


Although I don't usually use the latter, I can say online d 
editor yields the same ASM output for both:


File[] files = new File[10];
File[] files = new File[](10);


Re: Creating 1000 instances

2021-02-19 Thread Siemargl via Digitalmars-d-learn
On Friday, 19 February 2021 at 08:29:36 UTC, Ferhat Kurtulmuş 
wrote:


Since classes are reference types all instances of files will 
be the same reference of "new File()", which you probably don't 
want.


Is any differences between x and y definitions?

MyClass [] x, y;
x = new MyClass[7];

y= new MyClass[](8);



Re: Creating 1000 instances

2021-02-19 Thread Ferhat Kurtulmuş via Digitalmars-d-learn
On Friday, 19 February 2021 at 08:29:36 UTC, Ferhat Kurtulmuş 
wrote:
On Friday, 19 February 2021 at 08:04:19 UTC, Виталий Фадеев 
wrote:

[...]


files = new File[]( 1000 );
files[] = new File(); // add this

Since classes are reference types all instances of files will 
be the same reference of "new File()", which you probably don't 
want.


You can do

files[].each!((ref a) => a = new File);


Re: Creating 1000 instances

2021-02-19 Thread Ferhat Kurtulmuş via Digitalmars-d-learn
On Friday, 19 February 2021 at 08:41:06 UTC, Ferhat Kurtulmuş 
wrote:
On Friday, 19 February 2021 at 08:29:36 UTC, Ferhat Kurtulmuş 
wrote:
On Friday, 19 February 2021 at 08:04:19 UTC, Виталий Фадеев 
wrote:

[...]


files = new File[]( 1000 );
files[] = new File(); // add this

Since classes are reference types all instances of files will 
be the same reference of "new File()", which you probably 
don't want.


You can do

files[].each!((ref a) => a = new File);


oh, now we can remove brackets

files.each!((ref a) => a = new File);


Re: Creating 1000 instances

2021-02-19 Thread Ferhat Kurtulmuş via Digitalmars-d-learn

On Friday, 19 February 2021 at 08:04:19 UTC, Виталий Фадеев wrote:

We have:
class File
{
// WIN32_FIND_DATAW data;
}

void fastReadDir()
{
File[] files;

// reserve space, allocating instances
files = new File[]( 1000 );  // <--- trouble here ?

// filling instances
auto file = files.ptr;

writeln( file.data );// <--- or trouble here ?

// ...
}

Got:
SegFault

Goal:
Allocate memory for 1000 instances at once.

Source:
https://run.dlang.io/is/xfaXcv

Question:
What is the true, fastest, beauty way to create 1000 
instances of the class File ?


files = new File[]( 1000 );
files[] = new File(); // add this

Since classes are reference types all instances of files will be 
the same reference of "new File()", which you probably don't want.




Creating 1000 instances

2021-02-19 Thread Виталий Фадеев via Digitalmars-d-learn

We have:
class File
{
// WIN32_FIND_DATAW data;
}

void fastReadDir()
{
File[] files;

// reserve space, allocating instances
files = new File[]( 1000 );  // <--- trouble here ?

// filling instances
auto file = files.ptr;

writeln( file.data );// <--- or trouble here ?

// ...
}

Got:
SegFault

Goal:
Allocate memory for 1000 instances at once.

Source:
https://run.dlang.io/is/xfaXcv

Question:
What is the true, fastest, beauty way to create 1000 
instances of the class File ?