当我将一个数组变量分配给另一个数组变量时,复制/共享了多少信息?
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
覆盖里面的 11 a
?确切时间是
a
和 b
彼此分离? D 在后台表演一些 COW 吗?
最佳答案
D 中的“数组”实际上并不存在。
Slices do.
切片只是一个指针和一个长度。因此,当您将它们相互分配时,指针和长度会被复制。如果您修改目标数据,那么它将在切片的所有实例中都可见——但是如果您放大一个切片,另一个切片仍将使用其旧长度。
您通常无法“缩小”内存中数组的实际长度(尽管您当然可以减少切片的长度,因此它“看到”的数据更少),因此不会引起问题。
希望这能解释发生了什么。
关于arrays - 数组变量共享多少信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8790978/