一些编程语言使用inline
或其他关键字来手动指定要替换为被调用函数体的函数调用位置。
例如,C#就没有这样的功能,因为编译器会自动决定哪些代码被内联,在我看来,这避免了污染开发人员的体验(开发人员不应该担心优化)。
一些语言实现了inline
类的语法,如Kotlin和现在的Dart,它们将现有类型 Package 成新的静态类型,减少了传统类的开销。
Dart声明示例(已指定,尚未实现):
inline class Foo {
// A single instance variable, defining the representation type.
final Bar bar;
// The desired set of other members.
void function1() {
bar.baz;
}
...
}
我的问题是,编译器能在类中自动进行这种优化吗?如果不能,是什么挑战使这变得困难/不可能?
1条答案
按热度按时间l0oc07j21#
这不仅仅是优化的问题,有些内联可能会降低代码的性能和/或使代码变得更大,所以Kotlin给了你控制权(IntelliJ在某些情况下警告不要内联--警告你内联不会提高性能)。
不仅如此,您还应该阅读Reified Type Parameters-它允许使用某些编码技术,这些技术只有在函数和类型信息被内联时才有可能。
下面是一些在Java中不可能实现的代码:
假设你有一系列的枚举,代表一个对象的状态,例如:
并且您有一个测试数据生成器,它使用Random数生成器为Object挑选一个随机枚举。
在Kotlin中,您可以写:
用这个