首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用全局TList<real>

使用全局TList<real>
EN

Stack Overflow用户
提问于 2019-02-16 16:34:53
回答 1查看 143关注 0票数 0

我主要想问的是,每次添加新项时,使用TList是否比更改动态数组的长度更合适。就像这样:

代码语言:javascript
复制
SetLength(DynamicArray, Length(DynamicArray)+1);
DynamicArray[length(DynamicArray)] := NewElement; 

假设它是更多的学徒。我想知道,如果我想要创建一个全局动态数组,单元中的所有函数都可以访问这个数组,这样的事情是否有效。

代码语言:javascript
复制
type
   Tdata = Record
     y: TList<real>;
     x: TList<integer>;
End;

var
  data: Tdata;

procedure TForm1.FormCreate(Sender: TObject);
begin
  data.y  := TList<real>.Create;
  data.y.add(1.2);
  data.y.add(2.3);
end;

procedure TForm1.ButtonClick(Sender: TObject); // Some button click event
begin
  Memo1.lines.add(data.y.count); // Should output 2
end;

我不知道我需要在哪里创建TList,以及为什么我们首先需要创建它,而不是普通的数组。我是否需要在事件函数中再次创建TList,以及何时释放它?我正在跟踪这个例子,,但我仍然不知道如何与函数一起工作?谢谢你,乔纳森

EN

回答 1

Stack Overflow用户

发布于 2019-02-16 20:48:38

我不知道我需要在哪里创建TList,以及为什么我们首先需要创建它,而不是普通的数组。

TList是一个必须通过调用Create来实例化的对象。与堆上分配的任何对象一样,必须在使用之前创建它。

当您不再需要它时,必须通过调用Free来释放它。请注意,TList具有数组以外的其他特征。它有处理排序、比较、插入之类的方法、属性等。

“普通”数组可以是静态数组,也可以是动态数组。

  • 动态阵列是托管类型,其中使用引用计数自动处理生存期。通过调用SetLength或通过与另一个数组或值的连接将其分配给堆。
  • 只要静态阵列在范围内,就会自动分配堆栈,因此不需要显式创建。

我是否需要在事件函数中再次创建TList,以及何时释放它?

在您的示例中,变量data是全局变量。一旦分配了xy字段,它们就会一直存在直到被销毁。所以,不,你不必再创建它们了。

正如@Remy所述,如果您想在整个单元中使用data变量,则可以在单元的初始化和最后确定部分中对其进行初始化和最后确定。

我主要想问的是,每次添加新项时,使用TList是否比更改动态数组的长度更合适。

就像上面提到的,TList<T>是一个具有排序等方法的对象。如果您不需要这些额外的函数,动态数组就可以了。

如果您正在考虑性能,请首先使用分析器来确定您是否会通过优化代码获得任何东西。在动态数组中逐项添加项可能比使用TList慢。TList将在更大的块中扩展其内部数组,以避免过多的堆重新分配。

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

https://stackoverflow.com/questions/54725250

复制
相关文章

相似问题

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