Why allow initializers of non-static members that allocate?
matheus
matheus at gmail.com
Sat Jun 11 01:14:06 UTC 2022
On Friday, 10 June 2022 at 07:49:43 UTC, Mike Parker wrote:
> ...
> And it *is* documented:
>
>> Struct fields are by default initialized to whatever the
>> Initializer for the field is, and if none is supplied, to the
>> default initializer for the field's type.
>> The default initializers are evaluated at compile time.
>
> https://dlang.org/spec/struct.html#default_struct_init
Hmm I understand the text but for this intializers I was
expecting new address with length 5, for example:
import std.stdio;
struct S{
int[] arr = new int[](5);
int[2] arr2;
}
void main(){
S s1, s2;
s2.arr[0] = 42;
writeln(s1.arr[0], " address: ", &s1.arr[0]);
writeln(s2.arr[0], " address: ", &s2.arr[0]);
s2.arr2[0] = 10;
writeln(s1.arr2[0], " address: ", &s1.arr2[0]);
writeln(s2.arr2[0], " address: ", &s2.arr2[0]);
}
Prints:
42 address: 5586F5BD9CC0
42 address: 5586F5BD9CC0
0 address: 7FFFC65C7A20
10 address: 7FFFC65C7A40
And as it can be seen: s1.arr and s2.arr shares the same address.
So, in the case of "int[] arr = new int[](5)", an array of length
5 of type int will be instantiated and its address will be shared
among whoever instantiates "S" and be pointed and accessed
through arr.
In the second case, "int[2] arr2", 2 consecutive integer spaces
in memory will be allocate independently for each "instantiation"
of "S", so different address.
I never saw this before (I mean I never wrote the first case),
I'm used to the "int[2] arr2;" way of declaring it, but if I had
looked this code without knowing this, I'd be certain that s1.arr
and s2.arr would have different addresses.
This is a bit weird (At least for a newbie like me), I really
think the compiler should emit an warning about this.
Matheus.
More information about the Digitalmars-d-learn
mailing list