当我将一个数组变量分配给另一个数组变量时,复制/共享了多少信息?
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
显然,a
和b
共享相同的有效负载,因为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吗?
当a
和b
完全相互分离时? D在后台执行某些COW吗?
答案 0 :(得分:7)
切片只是指针和长度。因此,当您将它们分配给彼此时,指针和长度会被复制。如果您修改目标数据,那么它将在切片的所有实例中可见 - 但如果您放大一个切片,另一个切片仍将使用其旧的长度。
您通常无法“缩小”内存中数组的实际长度(尽管您可以减少切片的长度,因此它'看到的数据更少),因此不会导致问题。
希望能够解释发生了什么。
答案 1 :(得分:3)
array variables in D are equivalent to
struct array!T{
size_t length;
T* ptr;
}
(加上索引和切片的实现)
附加特殊之处在于它可以保留原始切片并追加到末尾。只有当数组的capacity足够大或者realloc可以在适当的位置扩展时,才会发生这种情况
这些最后的东西都在GC中维护