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
开放数组将实现这一点。
在 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
开放数组将实现这一点。