gpt4 book ai didi

Scala:扩展特征的类是否总是采用特征属性?

转载 作者:行者123 更新时间:2023-12-04 19:59:26 25 4
gpt4 key购买 nike

鉴于以下情况:

class TestClass extends TestTrait {
def doesSomething() = methodValue + intValue
}

trait TestTrait {
val intValue = 4
val unusedValue = 5
def methodValue = "method"
def unusedMethod = "unused method"
}

当上面的代码运行时,TestClass 是否真的将内存分配给了未使用的值或未使用的方法?我使用过 javap 并且我知道存在一个未使用的值和一个未使用的方法,但我无法确定它们是否实际填充了任何类型的状态或内存分配。

基本上,我试图了解一个类是否总是获得 trait 提供的所有内容,或者编译器是否足够聪明以仅提供该类从 trait 中实际使用的内容?

如果 trait 总是强加给一个类,它似乎效率很低,因为我预计许多程序员会将 trait 用作 mixin,因此到处浪费内存。

感谢所有阅读并帮助我深入了解此事的人!

最佳答案

一般来说,在 Scala、Java 和 C++ 等语言中,每个类都有一个指向其实例方法的指针表。如果您的问题是 Scala 编译器是否会在方法表中为 unusedMethod 分配插槽那么我会说是的,它应该。

我认为您的问题是 Scala 编译器是否会查看 TestClass 的主体并说“哇,我只看到 methodValueintValue 的使用,所以作为一个好的编译器,我将避免在 TestClass 的方法表中为 unusedMethod 分配空间。但它不能一般真的这样做。原因是,TestClass 会被编译成一个类文件TestClass.class,而这个类可能会被你甚至不知道的程序员在库中使用。

他们想对你的类(class)做什么?这个:

var x = new TestClass();
print(x.unusedMethod)

看,问题是编译器无法预测将来谁会使用这个类,因此它将所有方法都放入其方法表中,即使是那些未被类中其他方法调用的方法。这适用于在类中声明的方法或通过实现的 trait 获取的方法。

如果您希望编译器在固定的封闭系统上进行全局系统范围的静态分析和优化,那么我认为理论上它可以减少这些事情,但我怀疑这将是一个非常昂贵的优化并且不值得。如果您需要这种内存节省,您最好自己编写较小的特征。 :)

关于Scala:扩展特征的类是否总是采用特征属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7219098/

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