scala - AnyVal 子类型存储在 Scala 中的什么位置?

标签 scala

在 Java 中,当我们在方法中创建原语时,它们存储在堆栈内存中,而实例化的对象(如使用 new)则放在堆中。在 scala 中,AnyVal 的子类型(如 Int)是无法实例化的不可变值实例。因此,如果我在 Scala 方法中创建 Int ,它会进入堆还是堆栈。我问它是因为在 Scala 中 Int 是一个对象。

最佳答案

Scala Language Specification没有说明内存是如何组织的。每个实现都可以随意组织其内存。

顺便说一句,你关于 Java 的说法是错误的:

In Java, within a method when we create primitives they are stored in stack memory,

Java Language Specification 中没有任何内容这就是说。事实上,对于许多实现来说,这不是真的。例如,Oracle JDK 的实现将尝试将原语存储在寄存器中,或者完全忽略它们,而不是将它们存储在堆栈中。

while objects instantiated (like using 'new') are put on heap.

同样,Java 语言规范中没有任何说明。同样,例如在 Oracle 的实现中,这不一定是正确的。 Oracle 的优化编译器将尽可能执行逃逸分析并在堆栈上分配对象,即当编译器可以证明引用没有逃逸范围时。 Azul's implementation总是在栈上分配对象(除非它可以证明引用肯定会逃出本地作用域),并执行逃逸检测,即当它检测到一个引用逃逸了本地作用域时,它会将对象从堆栈移动到堆中。

事实上,您完全可以在没有堆栈的情况下实现 Java,并且完全符合 Java 语言规范。

In scala, AnyVal’s subtypes(like Int) are immutable value instances that can’t be instantiated. So if I create an Int in a Scala method, does it go to heap or stack.

这取决于实现、版本、具体情况和许多其他因素。 Scala 语言规范并没有说明任何一种方式,实际上,它没有说明任何关于如何存储的内容,更不用说堆栈和堆了。

I am asking it because in Scala Int is an object.

但同样,这并没有说明它是如何实现的。例如,Scala-JVM 将 scala.Int 实现为 JVM 原语,然后简单地“伪造”这些方法。

关于scala - AnyVal 子类型存储在 Scala 中的什么位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49462471/

相关文章:

scala - 使用 Spark 中的动态列将 RDD 数据写入 CSV - Scala

scala - 当从Apache Spark作业将空字符串写入 Elasticsearch 时,如何解决错误?

scala - 光滑表定义中的自定义映射列类型

scala - 在 Scala 中实现 Scala 风格的字符串插值

scala - 如何用spark-csv解析使用^A(即\001)作为分隔符的csv?

scala - Scala 中 AnyVal 类型(Int、Double 等)的 +=/*=/etc 运算符

scala - Akka 匿名 Actor 可以访问 self 吗?

sql - 列模式的 Spark SQL 区分大小写过滤器

java - Eclipse 无法使用 Scala IDE 识别 TODO/FIXME 注释

Scala 柯里化(Currying)与部分应用函数