2017-12-16 6 views
3

は、我々は、JavaにいくつかKotlinのバイトコードをコンパイルすると、私たちは多くの場合はnullチェックを行い、この文を見ることができます:なぜ `Intrinsics.checkParameterIsNotNull`がインライン化されていないのですか? Kotlinで

Intrinsics.checkParameterIsNotNull(foo, "foo") 

我々はfurthurを探索した場合、我々はこの方法の逆コンパイル実装を見ることができ、それは実装のありますこれによってクラス(Intrinsics)のexistenseに

public static void checkParameterIsNotNull(Object value, String paramName) { 
    if (value == null) { 
     throwParameterIsNullException(paramName); 
    } 
} 

、私はそれが自動的に、私はSTDLIBから関数を使用しないように自分のベストを試みた場合でも、STDLIBなしKotlinを使用することはできません:それは名前だとまったく同じIntrinsics.checkParameterIsNotNullへの呼び出しを生成します。

このメソッドの実装は非常に短いため(非常に頻繁に表示されます)、なぜこの関数はインライン化されていませんか?

Kotlinコンパイラがこのヌルチェックを生成しないようにするための注釈がありますか? (@TrustedNotNullのようなもの)

ProGuardの場合:私は共有ライブラリに取り組んでいるため、ProGuardは私には適していないと心配しています。私は明らかにこれらのコード除去ツール(ProGuard、dce-js)を知っており、いつどのようにそれらを使用するかを知っています。
私はちょうどなぜ機能がインライン化されていないのか尋ねています。

+0

あなたの目標が瓶のサイズを減らすことであるならば、Proguardはあなたの親友です。 –

答えて

3

私の推測では、この最終的なメソッドの呼び出しはインライン展開より効率的です。

コードはシンプルに見えるかもしれませんが、そのバイトコードはかなり長いです。インライン展開すると効率が低下します。

+3

推測する必要はありません。 'Intrinsics.checkParameterIsNotNull'の呼び出しのバイトコードサイズを、対応するコードのバイトコードと実際に比較し、前者が実際にかなり小さいことを確認することができます。 –

1

誰かが表示され、より正式な技術的な答えがよりうまく表示されることを願っていますが、まず標準ライブラリを避ける(または回避しようとする)ことは一般的なアプローチではないと思います。これは、おそらくKotlinのコードベースで使用する必要がある言語の基本的な構造を含んでいます。 docsでさえ、次のように述べています。

Kotlin標準ライブラリは、Kotlinの日々の仕事に必要不可欠なものです。

あなたはその大き心配している場合は、あなたが使用していないことの任意の部分を取り除くためにプラットフォーム固有のツールを使用することができます - たとえば、あなたはJava用Proguardを使用することができ、およびJavaScriptについてDCE plugin。その内容のほとんどは相互依存ではないため、これらのツールは最終的な出力が標準ライブラリから含むコードの量を大幅に減らすことができます。

+0

私は共有ライブラリに取り組んでいるので心配しています。この場合、ProGuardは私には適していません。私は明らかにこれらのコード除去ツールを知っており、いつどのように使用するのかを知っています。私はアーティファクトを小さくしたいだけです。とりあえずありがとう。 – ice1000

1

既に述べたように、Kotlin言語は、stdlibを使用すると、それが真のパワーを発揮できるだけです。だから私はIntrinsicsものをインライン化する理由は見ません。真剣にstdlibを避けることを試みているクライアントであるべきではありません。

関連する問題