2016-12-15 68 views
6

的Delphi通阵列在C++中,可以通过const引用传递给功能的载体以这种方式:通过引用

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

这是有用的,当载体是非常大的,我想避免浪费它的复制时间。我知道,在德尔福相同的代码是:

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

它是否也有像C一样的效果++(通过地址而不是复制和优化/节省时间)?这是唯一的方法,还是有其他东西来优化参数传递?

+1

你在混淆开放数组参数和动态数组。这里不需要'[Ref]'。开放数组参数作为两个参数传递。第一个包含数组第一个元素的地址。第二个数组的长度(元素数)减1,即所谓的High()值。 –

+0

Delphi动态数组始终是引用类型。但你应该使用动态数组,而不是开放数组(这是一个遗留派生的混乱,我承认)。例如'procedure test(const a:TArray );' –

+1

@ Arioch'The这可以防止您传递静态分配的数组或使用开放数组构造函数。它迫使你进入没有需要的堆分配。开放的数组参数不是传统的,它们是主流的,设计良好的,非常有用。应尽可能使用它们,以使代码尽可能组合。 –

回答

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阵列,编译器允许其内容被修改。


我知道,在德尔福相同的代码是...

这并不准确。可能来自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开放数组将实现该目标。

7

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

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

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

C++中的向量是一个类。它在Delphi中像一个类一样传递,但常量是不同的。在德尔福,即使你通过一个类为const,它的方法仍然可以被调用。而在Delphi中,类实例已经是引用。不需要[Ref]

有关打开阵列参数in my article的更多信息。

+0

在C++代码中,可以调用'vector'实例的方法,但只调用'const'方法。 –

+0

好吧,但如果我通过一个开放的数组作为常量[参考]它是否有意义?或者他们默认通过ref? –

+0

@Rudy我没有看到任何与动态数组混淆的证据。这个问题没有提到动态数组。 –