gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:10:22 24 4
gpt4 key购买 nike

第一个问题:

D数组函数参数是始终通过引用还是通过值传递?
此外,该语言是否为数组实现“写时复制”?
例如。:

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)

最佳答案

  • 从技术上讲,像int[]这样的动态数组只是一个指针和一个长度。仅将指针和长度复制到堆栈,而不复制数组内容。 arr[0] = 42;确实修改了原始数组。
    另一方面,像int[30]这样的静态数组是一种普通的旧数据类型,由内存中的30个连续的int组成。因此,像void foo(int[30] arr)这样的函数会将120个字节复制到堆栈中作为开始。在这种情况下,arr[0] = 42;修改数组的本地副本。
  • 根据上面的内容,您列出的每种方法都避免了复制数组内容。因此,是否需要将参数设置为constinconst ref或其他方式取决于您要实现的目标,除了避免数组复制。例如,如果传递ref int [] arr参数,则不仅可以修改其内容,还可以修改指针和长度(例如,创建一个全新的数组并将其分配给arr,以便从功能之外)。

  • 有关更多信息,请参阅DLang网站上有关 arraysarray slices的相应文章。

    关于arrays - 将数组参数传递给D函数的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24102408/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com