gpt4 book ai didi

c# - 尽管 list 在内部使用数组(固定的),但它如何动态工作?

转载 作者:太空狗 更新时间:2023-10-29 20:47:32 24 4
gpt4 key购买 nike

我已经知道 C# 中的泛型和数组(我知道 C++ 中使用指针的动态数组),我也知道数组是固定大小的,所以我们不能在初始化后改变它的大小,我们必须分配一个新的一个然后复制……

最近,我一直在使用 ILspy 查看 .net 程序集的源代码,我发现 List 在内部依赖于一个私有(private)数组,但我无法弄清楚它是如何工作的,所以我想知道它在技术上如何发展还是在我对其进行主操作时在内存中调整大小?

最佳答案

List<T>分配一个数组 T[]一些大小,并将其用作其项目的存储,直到数组填满。当发生这种情况后需要添加新项目时,列表会分配一个新的更大的数组,并将所有项目从旧数组复制到新数组。然后可以毫无问题地添加新项目。

由于此行为,将项目附加到 List被描述为 amortized O(1) 操作:由于后备数组中有可用空间,大多数追加将花费常数时间,但一些追加将触发数组重新分配并花费更多时间。

List的公共(public)接口(interface)中也可以看出实现方式。 : 有一个 Capacity 控制列表在不调整大小的情况下可以容纳多少项目的属性,还有一个 constructor这让您可以预先保留一些指定的容量(当您事先知道列表将至少达到一定大小时,这有助于避免不必要的调整大小操作)。

关于c# - 尽管 list<T> 在内部使用数组(固定的),但它如何动态工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18602993/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com