d - dup 如何在交错数组上工作



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

棘轮怪胎是对的,它是一个肤浅的副本。您可以在 dmd2/src/druntime/src/rt/lifetime.d 中看到 dup 函数的源代码。该函数称为_adDupT。

这是一个非常短的函数,主要工作是对memcpy((的调用。在函数上方,您可以看到数组的表示形式:struct { size_t length; void* ptr; }

交错数组将是数组数组,因此内存看起来像 [length0, ptr0, length1, ptr1, length2, ptr2....]

由于对这些指针的memcpy不遵循它们,这意味着slice.dup是一个浅层副本。

对于任何复制切片的东西,这通常是正确的,除非你自己做某事,否则它总是浅拷贝。所以结构 A {char[] str; }甲、乙;a = b;也会浅拷贝,所以断言(a.str 是 b.str(。

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

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

(你也可以预分配newArray.length = oldArray.length,如果你想加快一点速度,可以用索引赋值(

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

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

最新更新