On 10/19/2015 09:57 PM, Adam D. Ruppe wrote:
On Monday, 19 October 2015 at 19:53:14 UTC, Andrei Alexandrescu wrote:
struct A {
int[] x = new int[10];
}
void main() {
import std.stdio;
A a;
a.x[1] = 42;
writeln(a.x);
}
Looks like a bona fide runtime array to me.
It is still in the static data segment. Try this:
struct A {
int[] x = new int[10];
}
void main() {
import std.stdio;
A a;
a.x[1] = 42;
writeln(a.x);
A a2;
writeln(a2.x);
assert(a.ptr is a2.ptr); // passes
}
The `new int[10]` is done at compile time and the pointer it produces is
put into the .init for the struct. So the same pointer gets blitted over
to ALL instances of `A`, meaning they alias the same data (until the
slice gets reallocated by append or whatever).
This is the worst part:
class C{
int[] x=[1,2,3];
}
void main(){
auto mut=new C;
auto imm=new immutable(C);
assert(imm.x[0]==1);
mut.x[0]=2;
assert(imm.x[0]==2);
}