gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:29:13 24 4
gpt4 key购买 nike

在 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/

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