Delphi 通过引用传递数组

Delphi pass array by reference

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

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

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

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

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

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

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

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

C++ 中的向量是 class。它像 Delphi 中的 class 一样传递,但 constness 是不同的。在 Delphi 中,即使你将 class 作为 const 传递,它的方法仍然可以被调用。在 Delphi、class 实例中 已经是 引用。不需要 [Ref].

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

procedure test(const a: array of Integer);

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

只有按值传递开放数组才会创建副本:

procedure test(a: array of Integer);

为了完整起见,另一种选择是绕过 var

procedure test(var a: array of Integer);

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


I know that the same code in Delphi is ...

这不太准确。可能从 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++ 数组区分开来。

我现在有点乱。大多数情况下,我想表达的是细节决定成败。 None 这些东西在这些语言之间完美映射,因为这些语言有细微差别。

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