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

时间:2014-06-08 02:11:12

标签: arrays d

第一个问题:

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)

1 个答案:

答案 0 :(得分:11)

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

  2. 根据以上所述,您列出的每种方法都避免了复制数组内容。因此,您是否需要参数constinconst ref或其他方式取决于您尝试实现的目标,除了避免数组复制。例如,如果传递ref int [] arr参数,不仅可以修改其内容,还可以修改指针和长度(例如,创建一个全新的数组并将其分配给{{1这样从函数外部可以看到它。

  3. 有关详细信息,请参阅DLang网站上涵盖arraysarray slices的相应文章。