2013-06-13 9 views
17

私の大学のプロジェクトの1つでは、私はJavaバイトコードで直接作業しています。javaバイトコード - intより小さい型の表現

JVM(http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings)で利用可能な命令のリストを閲覧した後、私は[b|c|s]store,のみistoreローカル変数に整数を格納するためのようなものが存在しないことを見ました。私は、任意のメモリを節約していないです

short a; 
int b; 

、すべてのローカル変数エントリは4つのバイトを占有するので:それは私のプログラムでは、私が書いた場合ということを意味していますか?

私はいつもshortまたはbyteタイプを使用すると、実行時にメモリを節約するという印象を受けました。

+2

これは正しいと思います。ただし、 'byte []' sを使っても節約できます。 –

答えて

13

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

注ほとんどの命令[...]は整数型byteためのフォーム、char、およびshortを持っていないこと。いずれも、booleanタイプのフォームはありません。コンパイラは、コンパイル時に型のintの値にこれらの値をまたは実行時に、符号拡張Java仮想マシンの命令を使用してタイプbyteshortのリテラル値の負荷を符号化します。 [...]したがって、実際のタイプbooleanbytechar、及びshortの値にほとんどの操作が正しく計算タイプintの値を操作する命令によって実行されます。

したがって、正当化される:Java仮想マシンの1バイトのオペコードのサイズを考えると

は、オペコードにエンコードの種類は、その命令セットの設計に圧力を置きます。各型付き命令がすべてのJava仮想マシンの実行時データ型をサポートしていれば、1バイトで表現できる命令以上の命令が存在します。代わりに、Java仮想マシンの命令セットは、特定の操作に対してタイプサポートのレベルを低下させます。換言すれば、命令セットは意図的に直交していない。サポートされていないデータ型とサポートされているデータ型を必要に応じて変換するには、別の命令を使用できます。

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

3

ローカルメモリintlongを使用しているメモリは、64ビットレジスタに格納されている可能性があります。注:バイトコードの配置方法とコードの実際の実行方法は同じではありません。

新しいハードウェアで2バイトを保存することは重要ではありません。 2バイトの値は、最低賃金であっても点滅するまでに要する時間が1/1000未満です。

+0

私は重要な記憶を保存しないことを知っています、私はこの事件に興味がありました。 – Andna

+0

2バイトの節約額があれば、もっと興味深いかもしれません...しかし、私は同意します。通常、現代のシステムでは数バイトについて考えて時間を無駄にするのは意味がありません。 – brimborium

+0

はい、組み込み環境では、これらのバイトは加算される可能性があります。 – SnakeDoc

関連する問題