Delphi通过引用

时间:2016-12-15 08:51:37

标签: delphi delphi-10.1-berlin

在C ++中,可以通过const引用以这种方式将函数传递给函数:

void test(const std::vector<int>& a);

当矢量非常大并且我想避免浪费时间复制它时,这很有用。我知道Delphi中的代码是:

procedure test(const [Ref] a: array of Integer);

它是否也具有与C ++相同的效果(传递地址而不是副本并优化/节省时间)?这是唯一的方法还是还有其他方法可以优化参数传递?

2 个答案:

答案 0 :(得分:12)

procedure test(const a: array of Integer);

这是一个开放数组,传递为const。这些已经通过引用传递。在这种情况下添加[ref]是不必要的。

仅当您按值传递打开的数组时,才会进行复制:

procedure test(a: array of Integer);

为了完整起见,另一个选择是通过var

procedure test(var a: array of Integer);

此处数组通过引用传递,但与const数组相反,编译器允许修改其内容。

  

我知道Delphi中的代码是......

这不太准确。可能来自C ++ std::vector<T>的最佳映射是Delphi的TList<T>。可能与Delphi开放数组参数最接近的匹配是C ++数组参数。您可以映射Delphi程序:

procedure test(const a: array of Integer);

到这个C ++函数:

void test(const int a[], const size_t len);

所以你并没有真正比较喜欢。

也就是说,实际调用此类函数时可能正在使用的Delphi动态数组是托管类型。这意味着它们的生命周期由自动引用计数(ARC)管理,并使它们与原始C ++数组区别开来。

我现在有点乱了。我想要达到的主要是魔鬼在细节中。这些东西都没有完美地映射到这些语言之间,因为这些语言有着微妙的差异。

但是,抛开这些细微差别,如果你希望在Delphi中有效地传递数组,那么const开放数组将实现这一点。

答案 1 :(得分:7)

您正在混淆开放数组参数和动态数组。这里不需要[Ref]

打开数组参数实际上是作为两个参数传递的。

  • 第一个包含数组第一个元素的地址。
  • 第二个是数组的长度(元素的数量)减去1,即所谓的High()值。

C ++中的向量是一个类。它像Delphi中的类一样传递,但constness是不同的。在Delphi中,即使您将类传递为const,仍然可以调用其方法。在Delphi中,类实例已经是引用。无需[Ref]

有关开放数组参数in my article的更多信息。