的Capacity
属性几乎是理想的,因为它会在内部数组中分配的条目正确的号码。然而,它具有不幸的缺点:
- 新分配的内存没有初始化。
- 元素数量
Strings.Count
未更新。
由于Delphi组件体系结构涉及基类型TStrings
,因此您可以提供可支持更高效的调整大小功能的具体子类。例如。考虑以下实施TList.SetCount
。
procedure TList.SetCount(NewCount: Integer);
var
I: Integer;
begin
if (NewCount < 0) or (NewCount > MaxListSize) then
Error(@SListCountError, NewCount);
if NewCount > FCapacity then
SetCapacity(NewCount);
if NewCount > FCount then
FillChar(FList^[FCount], (NewCount - FCount) * SizeOf(Pointer), 0)
else
for I := FCount - 1 downto NewCount do
Delete(I);
FCount := NewCount;
end;
更新能力后,如果有新分配的内存,它使用FillChar
初始化。这比一次添加/删除项目更有效率。
因此,您可以提供自己的TStrings
子类的独立具体实现,或者简单地复制Delphi的TStringList
,其中包含适当的SetCount
方法。但是,我认为这段代码不太可能会遭受任何性能问题,因此您自己的解决方案包装在合适的实用程序方法中就足够了。 David's answer也很好,虽然我个人认为“班级帮手”功能是非常有用的。实施班级助手的“老办法”更加通用。
为什么不使用'TList'而不是? –
我不记得不得不调整一个字符串列表来容纳N个元素,所以我想知道你的用例吗?也许其他数据结构可以更好地满足您的需求。 –
为什么你需要调整列表的大小?这是一个重要的问题,因为它对最佳答案有重大影响。例如。调整大小是因为其他代码恰好需要N个元素与调整大小完全不同,以避免在您确切知道要保存多少个字符串时,为超大型列表创建冗余的内存开销。 –