将数组参数传递给D函数的正确方法

gla*_*ert 6 arrays d

第一个问题:

D数组函数参数是否总是通过引用或值传递?此外,该语言是否实现了Copy for Write for arrays?例如:

void foo(int[] arr)
{
    // is arr a local copy or a ref to an external array?

    arr[0] = 42; // How about now?
}
Run Code Online (Sandbox Code Playgroud)

第二个问题:

假设我有一个大型数组,它将foo作为一个只读参数传递,应该尽可能避免复制数组,因为它被认为是一个非常大的对象.以下(或者没有)将是最好的功能声明foo:

void foo(const int[] bigArray)

void foo(in int[] bigArray)

void foo(const ref int[] bigArray)
Run Code Online (Sandbox Code Playgroud)

Gas*_*ssa 11

  1. 从技术上讲,动态数组就像int[]一个指针和一个长度.只有指针和长度被复制到堆栈上,而不是数组内容.An arr[0] = 42;会修改原始数组.
    另一方面,静态数组类似于int[30]普通旧数据类型,由int内存中的30个连续s 组成.因此,类似的函数void foo(int[30] arr)会将120个字节复制到堆栈中以便开始.在这种情况下,arr[0] = 42;修改数组的本地副本.

  2. 根据以上所述,您列出的每种方法都避免了复制数组内容.所以,无论你需要的参数为const,in,const ref或以其他方式取决于你正在努力实现除了避免阵列复制的内容.例如,如果传递ref int [] arr参数,不仅可以修改其内容,而且还可以修改指针和长度(例如,创建一个全新的数组并将其分配给它,arr以便从外部可见功能).

有关详细信息,请参阅DLang站点上有关阵列数组切片的相应文章.