2017-10-19 5 views
3

inline修飾子を正しく使用する方法を理解しようとしています。 docsに記載されているように、過剰割り当てを防ぐためにラムダをインライン展開する一般的なケースを理解しています。lambdaなしでインラインで使う理由

私はkotlin STDLIBを検査し、コードの_Strings.kt次作品で見つかりました:

@kotlin.internal.InlineOnly 
public inline fun CharSequence.elementAtOrNull(index: Int): Char? { 
    return this.getOrNull(index) 
} 

ここinlineを使用しての背後にある理由は何ですか?

答えて

2

この特定の機能やkotlin-stdlibでいくつかの他は、それらが実際のSTDLIBクラスファイルに存在しないし、それらをインライン化するKotlinコンパイラのためにのみ利用可能ですので、@InlineOnlyとしてマークされています。このようにして達成される目標は、Androidで重要な成果物のメソッド数を減らすことです。

ラムダなしのinline関数を使用すると、reifying type parametersのために便利です。

1

軽度であっても、避けることができるオーバーヘッドがあります。

A similar discussion on Inline Extension Properties.

A post on Kotlin Extensions which gets down into the bytecode effects

+0

私の例では、余分なメソッド宣言だけが表示されます。その場合、なぜインラインでメソッドをマークしたくないのですか?ドキュメントは、大規模なメソッドをインライン展開すると生成されるコードが大きくなるため、100行以下のすべてのメソッドにインラインを追加する必要がありますか? – mol

+0

クラス内のバッキングフィールドを使用するメソッドをインライン化することはできません。拡張メソッドは、追加パラメータとして拡張しているクラスを技術的に受け取っているため、実際には追加されないため、この問題は発生しません。 – dillius

0

私はそれが効率に関係していると言います。関数elementAtOrNullを呼び出すのではなく、getOrNullを呼び出す代わりに、これは直接呼び出されます。

関連する問題