Inno setup TStringList vs字符串数组vs TArrayOfString

Inno setup TStringList vs字符串数组vs TArrayOfString,inno-setup,tstringlist,Inno Setup,Tstringlist,我正在重构一个Inno安装项目,我不太清楚的是 TArrayOfString、String数组和TStringList的使用。这三种类型的区别是什么? 据我所知,在使用上似乎没有什么不同。所有三个存储字符串和我都可以通过如下方式使用array\list获得存储字符串:arrayName[i] 当使用其中一种时,是更快还是被认为是糟糕的编码? 我希望有人能澄清这件事。1。差别 TArrayOfString类型是字符串数组的别名,因此它们等于(您可以在源代码中找到)。TStringList类是一个索

我正在重构一个Inno安装项目,我不太清楚的是 TArrayOfString、String数组和TStringList的使用。这三种类型的区别是什么? 据我所知,在使用上似乎没有什么不同。所有三个存储字符串和我都可以通过如下方式使用array\list获得存储字符串:
arrayName[i]

当使用其中一种时,是更快还是被认为是糟糕的编码? 我希望有人能澄清这件事。

1。差别
TArrayOfString
类型是字符串数组的别名,因此它们等于(您可以在源代码中找到)。
TStringList
类是一个索引字符串集合类,其内部存储是一个记录数组。但是字符串数组和
TStringList
类之间有很大的区别

字符串的
数组
只是字符串元素的索引存储,而
TStringList
类是一个集合类,为多个内容处理任务(如消除重复、排序、搜索等)提供选项和方法

2.演出 如果我们忘记了
TStringList
类提供的方法,并将其视为一个存储,那么当我们想要比较性能时,我们必须关注如何将字符串元素添加到应用程序中的该存储中

通常,只要不经常调整数组的大小,
数组
类型将更快,例如,当频繁调用时,这对于添加单个元素是无效的:

procedure AddSingleElement(var A: array of string; const S: string);
begin
  SetArrayLength(A, GetArrayLength(A) + 1);
  A[High(A)] := S;
end;
这是因为存储阵列的内存被重新分配。这需要一些时间。但是,如果设置数组长度的频率较低,则可以防止此瓶颈。理想情况是只将数组长度设置为目标长度一次(当然,这需要事先知道元素计数)

改进上述代码的另一个选项(当您事先不知道元素的计数时)是通过几个元素预先分配数组长度。这将减少重新分配的数量,但也要求您记住并使用逻辑实际数组长度进行操作。这就是添加项目时,
TStringList
类在内部为您所做的事情

如果将项添加到
TStringList
对象,字符串列表将检查是否有足够的空间容纳该项,如果没有,则会将其内部数组的长度增加几个元素(这样可以消除所述的重新分配性能问题)

但这并不像听起来那么重要,如果您在使用非常长字符串的非常长的数组上操作,您会注意到性能问题(在非常长的字符串的数千个、可能数十万个元素中)。我不想在这里具体说明数字,因为我认为这不是安装应用程序所需要的

3.结论 总之,阵列是更快的存储,但您应该避免频繁调整其大小。如果您真的非常关心性能,那么只分配一次它们的大小(如果您事先知道元素的数量),或者至少不频繁地分配更多的元素(这需要更多的编码)

TStringList
类失去了这场性能竞赛(仅仅因为它是一个围绕数组的包装器),但是当您逐个添加项时,它非常有效地调整了其内部存储的大小(无需为数组自己编写代码)

4.经验法则
根据经验,我建议在您事先知道元素的数量,或者不经常更改元素长度时使用数组。当您无法完成时,或者当您需要一些内置的内容处理例程时,请列出字符串列表。

非常好的回答thx。你真是一个“非凡的班级类型”;)不客气!nick来自捷克语,是
Lama
的类类型(
T
前缀)(加在一起就是
tlama
,这赋予了它不同的含义:)