在C ++中,可以通过const引用以这种方式将函数传递给函数:
void test(const std::vector<int>& a);
当矢量非常大并且我想避免浪费时间复制它时,这很有用。我知道Delphi中的代码是:
procedure test(const [Ref] a: array of Integer);
它是否也具有与C ++相同的效果(传递地址而不是副本并优化/节省时间)?这是唯一的方法还是还有其他方法可以优化参数传递?
答案 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]
。
打开数组参数实际上是作为两个参数传递的。
High()
值。 C ++中的向量是一个类。它像Delphi中的类一样传递,但constness是不同的。在Delphi中,即使您将类传递为const
,仍然可以调用其方法。在Delphi中,类实例已经是引用。无需[Ref]
。
有关开放数组参数in my article的更多信息。