原文 改变结构
位置会怎样?所以在main()
时,X结构一定在栈
中,而下面的一定在堆
中,是吧?
.1
这里,
按内存切片
声明y
(可是栈或堆
),并把它初化为包含Y.init
的1元素
数组.
这是D中
的重要怪癖
:每当用字面
初化聚集数组成员
时,聚集
的所有实例都*相同*
底层数组.
如果想避免
,建议在构造器
中初化y
.然后会更明确过程.
.2
,
这里声明了包含2个X元素
的静态数组
,每个X
实例都包含[Y.init]
数组切片
的y
成员.每个X
实例都在栈
上;但是,它们的y成员
在其他地方,这里为[Y.init]
数组.
重要
:如上,这里x[0].y
和x[1].y
,这两个不同
切片都引用[Y.init]
该相同数组
.
这里
这行是说,在x数组
的第一个
元素中,把0
赋值给y切片
数组中的第一个
元素.由于x[0].y
和x[1].y
都指向同一
底层数组,因此x[0].y
修改它
会使x[1].y
也修改了.
因此x[0].y[0]==0
及x[1].y[0]==0
.因为x[0].y.ptr==x[1].y.ptr
.
这里:
此行增加x[0].y
数组长度
.由于在程序全局数据区域
分配的,并按1元素
字面声明它,因此没有扩展空间
.
此时,为了兑现
延长数组请求,druntime
会在堆
上分配新数组
,并复制旧数组
,然后扩大
长度为2
.现在:
关键点:x[0].y
和x[1].y
现在指向两个
位于不同位置的不同数组
.A
中变化不再反映在B
中.
上面显示的[0]
数组,原来是x[0].y
数组,但不再这样,因为druntime
已在堆
中复制
了它,并更新了x[0].y
以指向副本
而不是源
.但是,x[1].y
继续指向原数组
.
变成:
这里,
为:
而
显示了上面.
如果把X置为"静态构
",会看到相同输出.