【问题标题】:Max array size in KotlinKotlin 中的最大数组大小
【发布时间】:2018-08-02 16:58:43
【问题描述】:

我正在通过 Android Studio 3.1.3 在 Kotlin 中编程。我创建了一个 Long 类型的数组,它显然太大而无法编译。在玩了一会儿之后,我发现我可以编译的最大数组包含 8,207 个元素。包含 8,208 个或更多元素的数组导致编译错误。数组中有 350 行元素,其中包含按数字顺序排列的素数。两个问题:

  1. 有人知道为什么会存在这个限制吗? 8,208 是 (2^13 + 2^4),但这似乎是一个奇怪的临界点。所以,我怀疑这是限制的原因。

  2. 有没有办法增加数组的允许大小?

注意:在 Android 论坛上,有人建议我使用 ArrayList 而不是 ArrayLong。我很欣赏这个建议并打算尝试一下,但对长阵列的限制对我来说仍然很奇怪。如果有人有更优雅的解决方案或对限制的解释,我很想听听!感谢您的宝贵时间。

【问题讨论】:

  • 请显示您的代码和您得到的确切错误。数组大小肯定不会导致编译错误。
  • @Earl Whitney 数组中有350行元素你的意思是编辑器行吗?
  • 代码如下所示:val primes: LongArray = longArrayOf(2, 3, 5, 7, 11, 13, 17 ... 84143, 84163, 84179, 84181, 84191)。确切的错误是:java.lang.illegalStateException:Backend Internal error: Exception during code generation。原因:错误生成类文件primeskt类...
  • 350 行元素,我的意思是在 Primes.kt 文件中,8,207 个元素在编辑器中占据 350 行。这可能与错误无关,但我想提供尽可能多的信息。

标签: android arrays kotlin


【解决方案1】:

所以,你想做的是这样的:

var a = longArrayOf(1,2,3,4,5,6,7,8...)

JVM 有限制。方法的最大大小为 64K。

如果您反编译您的代码,您将收到数组中每个元素的类似内容:

DUP
SIPUSH 8206
LDC 8207
LASTORE

这就是你达到极限的地方。

【讨论】:

  • 如果 OP 的测试是正确的:8207 个元素 x 8 个字节/Long = 65656 个字节,超过 64K=65536 个字节。
  • 如果你真的有兴趣,可以看一下字节码。编译器正在做一些优化,比如对前几个数字使用常量,对 128 以下的数字使用 int 缓存等等。
  • 我确定这与限制有关。 65656 如此接近 64K 绝非巧合。这些是极端情况,但很高兴知道
  • 我没有说这是巧合。我说的是我的计算不是绝对精确,但应该足以回答这个可能是拖钓的问题。
  • 我承认对极限感到惊讶;谢谢你让我知道这件事。我想我可以通过使用 Int 而不是 Long 来将数组的大小加倍,并在使用 primes[i] 值时使用 toLong。我的问题不是拖钓。我是新来的。如果我的问题让任何人感到不安,我深表歉意。
猜你喜欢
  • 1970-01-01
  • 2011-09-03
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 2010-10-24
  • 2012-04-06
  • 1970-01-01
  • 2012-08-09
相关资源
最近更新 更多