首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi pass数组

Delphi pass数组
EN

Stack Overflow用户
提问于 2016-12-15 08:51:37
回答 2查看 2.8K关注 0票数 6

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

代码语言:javascript
复制
void test(const std::vector<int>& a);

当向量很大时,这是有用的,我想避免浪费时间复制它。我知道Delphi中的相同代码是:

代码语言:javascript
复制
procedure test(const [Ref] a: array of Integer);

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-15 09:45:31

代码语言:javascript
复制
procedure test(const a: array of Integer);

这是一个打开的数组,作为const传递。这些文件已以参考方式通过。在这种情况下添加[ref]是不必要的。

只有当您按值传递打开的数组时,才会复制:

代码语言:javascript
复制
procedure test(a: array of Integer);

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

代码语言:javascript
复制
procedure test(var a: array of Integer);

在这里,数组是通过引用传递的,但是,与const数组不同的是,编译器允许修改其内容。

我知道德尔菲里同样的代码是..。

不太准确。从C++ std::vector<T>到Delphi的TList<T>可能是最好的映射。与Delphi数组参数最匹配的可能是C++数组参数。您可以映射您的Delphi过程:

代码语言:javascript
复制
procedure test(const a: array of Integer);

对于这个C++函数:

代码语言:javascript
复制
void test(const int a[], const size_t len);

所以你不是真的在比较,就像。

也就是说,Delphi动态数组是托管类型,您在实际调用这样一个函数时很可能使用它。这意味着它们的生存期由自动引用计数(ARC)管理,这使它们与原始的C++数组不同。

我现在有点闲逛了。我主要想弄清楚的是,魔鬼就在细节上。这些语言之间没有一个完美的映射,因为语言有其微妙的区别。

但是,撇开这些细微差别不谈,如果您希望在Delphi中高效地传递一个数组,那么const打开的数组就可以实现这一点。

票数 13
EN

Stack Overflow用户

发布于 2016-12-15 09:05:00

您混淆了打开的数组参数和动态数组。这里没有必要使用[Ref]

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

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

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

关于打开的数组参数在我的文章里的更多信息。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41159914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档