2

在添加到 C# 列表时明确检查/处理您没有达到 2^31 - 1 (?) 的最大条目数是疯狂的,是真是假?

(假设这是一个平均列表大小小于 100 的应用程序。)

4

8 回答 8

4

1.内存限制

嗯,没有任何属性的 System.Object 的大小是 8 个字节(2x32 位指针),或 64 位系统中的 16 个字节。[编辑:]实际上,我刚刚签入 WinDbg,在 x86(32 位)上大小为 12 字节。

因此,在 32 位系统中,您将需要 24Gb 内存(在 32 位系统上无法拥有)。

2. 程序设计

我坚信如此大的列表不应该保存在内存中,而应该保存在其他一些存储介质中。但在这种情况下,您将始终可以选择创建一个包装 List 的缓存类,该类将在后台处理实际存储。因此,在添加之前测试大小是错误的测试位置,如果有一天你发现有必要,你的 List 实现应该自己做。

3. 为了安全起见

为什么不在每个方法中添加一个重入计数器来防止堆栈溢出?:)

所以,是的,测试它是疯狂的。:)

于 2009-04-23T09:56:41.553 回答
2

显得过分了。根据列表中对象的大小,您不会先达到机器的内存限制吗?(我假设这个检查是由 List 类的用户执行的,在实现中没有任何检查吗?)

或许同事们都在提前考虑,这让人放心?(讽刺!)

于 2009-04-23T09:50:35.950 回答
1

看起来是这样,我可能不会包括支票,但我对此很矛盾。程序员曾经认为 2 位数字足以在日期字段中表示年份,理由是这对于他们的代码的预期寿命来说是可以的,但是我们发现这个假设是不正确的。

查看风险,查看努力并做出判断(也称为有根据的猜测!:-))。我不会说对此有任何硬性或快速规则。

于 2009-04-23T09:51:55.323 回答
0

正如上面的答案一样,我怀疑会出现更多问题而不是担心。但是,是的,如果你有时间和倾向,你可以打磨代码直到它发光!

于 2009-04-23T09:52:12.500 回答
0

真的

(好吧,你问的是真还是假..)

于 2009-04-23T09:55:51.787 回答
0

刚试过这段代码:

List<int> list = new List<int>();
while (true) list.Add(1);

我得到了 System.OutOfMemoryException。那么你会怎么做来检查/处理这个?

于 2009-04-23T09:58:28.380 回答
0

如果您继续向列表中添加项目,那么在达到该限制之前很久就会耗尽内存。我所说的“长”实际上是指“比你想象的要快得多”。

请参阅有关大对象堆 (LOB) 的讨论。一旦你达到大约 21500 个元素(在 64 位系统上是一半)(假设你正在存储对象引用),你的列表将开始成为一个大对象。由于 LOB 的压缩方式与普通 .NET 堆不同,因此您最终会将其碎片化到无法分配足够大的连续内存区域的程度。

所以你根本不需要检查那个限制,这不是一个真正的限制。

于 2009-04-23T10:06:14.617 回答
0

是的,这就是疯狂。

考虑当您开始达到这些数字时其余代码会发生什么。如果列表中有数百万个项目,该应用程序是否可用?

如果应用程序甚至有可能达到这样的数据量,那么也许您应该采取措施来防止列表变得那么大。也许您甚至不应该一次将所有数据保存在内存中。我真的无法想象任何代码都可以实际使用这么多数据的场景。

于 2009-04-23T10:07:08.407 回答