dup如何在锯齿状数组上工作?

时间:2013-10-08 09:46:54

标签: d jagged-arrays dup

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

1 个答案:

答案 0 :(得分:1)

棘轮怪物是对的,它是一个浅拷贝。您可以在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是一个浅拷贝。

这通常适用于复制切片的任何内容,除非您自己做某事,否则它总是浅层副本。所以struct A {char [] str; A a,b; a = b;断言也是浅的,所以断言(a.str是b.str)。

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

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

(你也可以preallocat newArray.length = oldArray.length并指定索引,如果你想加快一点)

结构的深层副本可以通过编译时反射来完成,但我更喜欢在那里编写克隆方法或其他内容,因为它更清晰。

我不知道这种预制的phobos功能。