数组变量共享多少信息?

时间:2012-01-09 15:42:06

标签: arrays variable-assignment d sharing deep-copy

当我将一个数组变量分配给另一个数组变量时,复制/共享了多少信息?

int[] a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
int[] b = a;
a[0] = 42;
writefln("%s %s", a[0], b[0]);   // 42 42

显然,ab共享相同的有效负载,因为42会被打印两次。

a ~= 10;
writefln("%s %s", a.length, b.length);   // 11 10

附加到a不会更改b,因此长度似乎不是有效负载的一部分?

b = a;
a ~= 11;
b ~= 42;
writefln("%s %s", a[11], b[11]);   // 11 42

符合D的实施是否也可以打印42 42?可以b ~= 42覆盖a内的11吗?

ab完全相互分离时? D在后台执行某些COW吗?

2 个答案:

答案 0 :(得分:7)

D中的“数组”并不存在。

Slices do.

切片只是指针和长度。因此,当您将它们分配给彼此时,指针和长度会被复制。如果您修改目标数据,那么它将在切片的所有实例中可见 - 但如果您放大一个切片,另一个切片仍将使用其旧的长度。

您通常无法“缩小”内存中数组的实际长度(尽管您可以减少切片的长度,因此它'看到的数据更少),因此不会导致问题。

希望能够解释发生了什么。

答案 1 :(得分:3)

array variables in D are equivalent to

struct array!T{
    size_t length;
    T* ptr;

}

(加上索引和切片的实现)

附加特殊之处在于它可以保留原始切片并追加到末尾。只有当数组的capacity足够大或者realloc可以在适当的位置扩展时,才会发生这种情况

这些最后的东西都在GC中维护