Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 数组变量共享多少信息?_Arrays_Variable Assignment_D_Sharing_Deep Copy - Fatal编程技术网

Arrays 数组变量共享多少信息?

Arrays 数组变量共享多少信息?,arrays,variable-assignment,d,sharing,deep-copy,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 显然,a和b共享相同的负载,因为42被打印两次 a ~= 10; writefln("%s %s", a.length, b.length); // 11 10 附加到a不会改变b,因此长度似乎不是有效负载的一部

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

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
b~=42
是否可以覆盖
a
中的11

什么时候
a
b
彼此分离?D在后台执行一些COW吗?

D中的“数组”实际上并不存在

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

通常情况下,您不能“收缩”内存中数组的实际长度(尽管您当然可以减少切片的长度,使其“看到”的数据更少),因此这不会导致问题

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

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

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


这些最后的东西都保存在GC中,

那么
~=
是否总是具有线性复杂性?我的印象是重复调用
~=
会比二次调用更好…@Fredwolflow:是的,它是线性的——如果可能的话,它确实会附加到原始数组,但由于旧切片只“看到”原始部分(通过它自己的长度副本),那么它就看不到您添加了任何内容。所以只有在不进行共享的情况下,
~=
才有效?这意味着
b=a
以某种方式修改了背景中的
a
,对吗?@FredOverflow:不,它是有效的——如果数组末尾有空间(“T的数组”=“内存中的实际数据”;“slice”=T[]=“对数组的引用”),那么它会在适当的位置追加并增加切片的长度。如果没有(例如,如果其他人通过附加到此切片的另一个副本来使用该房间),则它会复制数据。(
b=a
根本不会在后台修改
a
——这是一个简单的指针赋值。唯一的问题是,如果你附加到
b
,那么附加到
a
会导致重新分配——这仍然是线性时间,因为它只发生一次。)我想我现在要停止争论,开始读你链接到的那篇文章:)
struct array!T{
    size_t length;
    T* ptr;

}