19

私の大学のプロジェクトの 1 つで、Java バイトコードを直接扱っています。

JVM で使用できる命令のリスト ( http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings ) を参照した後、整数をローカル変数に格納するため[b|c|s]store,だけのものは存在しないことがわかりました。istore私のプログラムで私が書いた場合、それは意味します:

short a;
int b;

すべてのローカル変数エントリが 4 バイトを占有するため、メモリを節約していませんか?

shortorbyte型を使用すると、実行時にメモリがいくらか節約されるという印象を常に受け​​ていました。

4

2 に答える 2

16

これは、JVMS のセクション 2.11.1 で説明されています。

ほとんどの命令[...]byteには、整数型、char、およびの形式がないことに注意してくださいshortbooleanこのタイプのフォームはありません。コンパイラは、型のリテラル値のロードをエンコードし、コンパイル時または実行時にそれらの値を型の値に符号拡張する Java 仮想マシン命令を使用しますbyte[...]したがって、実際の型、、、およびの値に対するほとんどの操作は、計算型 の値を操作する命令によって正しく実行されます。shortintbooleanbytecharshortint

それは次のように正当化されます。

Java 仮想マシンのオペコード サイズが 1 バイトであることを考えると、型をオペコードにエンコードすることは、その命令セットの設計に圧力をかけます。型指定された各命令が Java 仮想マシンのランタイム データ型をすべてサポートしていると、1 バイトで表現できるよりも多くの命令が存在することになります。代わりに、Java Virtual Machine の命令セットは、特定の操作に対して低いレベルの型サポートを提供します。つまり、命令セットは意図的に直交していません。必要に応じて、個別の命令を使用して、サポートされていないデータ型とサポートされているデータ型を変換できます。

ただし、これはスタック変数のロード/ストアに適用されますが、プリミティブ配列へのロード/ストアには適用されません。すべてのプリミティブ型のオペコードがあります。

于 2013-06-13T18:51:34.537 に答える
3

これらは64ビットレジスタにある可能性が高いため、ローカルintvsを使用してメモリを節約していません。long注: バイト コードの配置方法と実際のコードの実行方法は同じではありません。

新しいハードウェアでは、2 バイトを節約することは重要ではありません。2 バイトの値は、最低賃金でもまばたきにかかる時間の 1/1000 未満です。

于 2013-06-13T18:54:10.023 に答える