3

我正在尝试制作一个快速的斐波那契算法。它通常需要将 BigInteger 分配给另一个变量,并且由于 C# BigInteger 是作为结构实现的,因此它需要复制整个数组,可能是数千个整数。所以我需要一个可以通过引用访问的 BigInteger 实现。.Net Reflector 和 ILSpy 都只显示空实现。

无论如何,看看源代码会很有趣,正如这里所问的那样: BigInteger 如何在内部存储值?

问题是每个所谓的源代码文件实际上都没有实现、dll 并从以下位置下载: http ://referencesource.microsoft.com/netframework.aspx

制作包装类不会有帮助,因为该算法需要大量计算,即使是简单的加法也需要整个数组的三个副本。

有谁知道为什么 BigInteger 被实现为结构?在哪里可以找到源代码?

4

3 回答 3

2

如果您需要更快的实施;我建议您看一下替代实现;例如GNU 多精度库包装器。

您还可以查看BigInt的这个实现。

于 2013-04-15T19:45:39.633 回答
1

BigInteger 和整个 .net 核心的完整源代码现在最终可以在source.dot.netgithub上获得。

于 2020-07-01T20:56:43.913 回答
0

我知道这个问题已经有八年的历史了,但我想在这里为将来阅读此问题的任何人澄清一些事情,因为这个问题是由结构引起的并且可能导致对结构的巨大误解。

问题陈述如下:

因为 C# BigInteger 是作为结构实现的,所以需要复制整个数组

这是绝对不正确的。是的,当将实例分配给任何东西时,存储在结构实例中的所有值都会被复制。但是,这并不意味着,在 的情况下BigInteger,当发生这种情况时,整个数组都会被复制。唯一复制的是对该数组的引用,这就像复制单个 int 值(我认为对象引用的确切大小取决于机器,但想法保持不变)。在结构中存储引用类型(类)的实例时总是如此。对象本身永远不会被复制,只有对它们的引用。

所以导致这个问题的问题实际上并不存在,所以没有理由担心由数组复制等引起的大量性能问题。

于 2021-11-15T12:14:32.227 回答