0

我希望它只复制嵌套数组切片而不是数组的整个深层副本,但突然间我有了疑问。

4

1 回答 1

1

棘轮怪胎是对的,它是一个浅拷贝。您可以在 dmd2/src/druntime/src/rt/lifetime.d 中查看 dup 函数的来源。该函数称为_adDupT。

这是一个非常短的函数,主要工作是调用 memcpy()。在函数上方,你可以看到一个数组的表示:struct { size_t length; 无效*点;}

锯齿状数组将是一个数组数组,因此内存看起来像 [length0, ptr0, length1, ptr1, length2, ptr2 ....]

由于这些指针上的 memcpy 没有跟随它们,这意味着 slice.dup 是一个浅拷贝。

这通常适用于任何复制切片的东西,除非你自己做一些事情,否则它总是浅拷贝。所以 struct A {char[] str; } 一个, b; a = b; 也会浅拷贝,所以断言(a.str 是 b.str)。

如果你想做一个深拷贝,最简单的方法就是循环它:

T[][] newArray;
foreach(item; oldArray)
      newArray ~= item.dup;

(如果你想加快速度,你也可以预先分配 newArray.length = oldArray.length 并分配索引)

结构的深层副本可以通过编译时反射来完成,尽管我更喜欢在其中编写克隆方法或其他东西,因为它更清晰一些。

我不知道这个预制的火卫一功能。

于 2013-10-08T14:04:47.957 回答