第一个问题:
D数组函数参数是否总是通过引用或值传递? 此外,该语言是否实现了Copy for Write for arrays? E.g:
void foo(int[] arr)
{
// is arr a local copy or a ref to an external array?
arr[0] = 42; // How about now?
}
第二个问题:
假设我有一个大数组将作为只读参数传递给函数foo
,应该尽可能避免复制数组,因为它被认为是一个非常大的对象。以下(或者没有)将是函数foo
的最佳声明:
void foo(const int[] bigArray)
void foo(in int[] bigArray)
void foo(const ref int[] bigArray)
答案 0 :(得分:11)
从技术上讲,像int[]
这样的动态数组只是一个指针和一个长度。只有指针和长度被复制到堆栈上,而不是数组内容。 arr[0] = 42;
会修改原始数组
另一方面,像int[30]
这样的静态数组是一种普通的旧数据类型,由内存中的30个连续int
组成。因此,像void foo(int[30] arr)
这样的函数会将120个字节复制到堆栈中以便开始。在这种情况下,arr[0] = 42;
会修改数组的本地副本。
根据以上所述,您列出的每种方法都避免了复制数组内容。因此,您是否需要参数const
,in
,const ref
或其他方式取决于您尝试实现的目标,除了避免数组复制。例如,如果传递ref int [] arr
参数,不仅可以修改其内容,还可以修改指针和长度(例如,创建一个全新的数组并将其分配给{{1这样从函数外部可以看到它。
有关详细信息,请参阅DLang网站上涵盖arrays和array slices的相应文章。