私の質問は次のとおりです。Javaの逆アセンブリから正しく取得した場合、
byte a=3,b=5;
System.out.println(a+b);
実際には byte の代わりに int を使用します。また、すべてのローカル メモリ スロットは、スタック スロットと同様に 4B です。バイト配列を割り当てる方がおそらく効率的であることは理解していますが、単一のバイト値を使用すると最終的に効率が悪いというのは本当ですか? (略して同点)
Java でbyte
とshort
が存在するのは、主に範囲が狭い整数データ型ではないことを理解することが重要です。(十分に小さい) 数値が格納されるほとんどのint
場合、有効な範囲が 0 ~ 100 であっても、 が使用されます。
byte
何らかの外的要因により、処理するデータがそれらの範囲に制限される場合にshort
使用されます。それらは、そのようなシステムとの対話を単純化するために存在します。
たとえば、最近のファイル システムはバイト ストリームを格納します。これらすべての読み取り/書き込み操作に使用できますが、データ型を使用すると操作が簡素化され、その区別が明確になります。int
byte
+
は整数演算です。それが理由です
byte c = a+b; // compile error
あなたが使用する必要があります
int c = a + b
また
byte c = (byte)(a+b);
私のアドバイスはint
、毎回キャストしないようにすることです。常にbyte
バイトを使用する場合は、それ以外の場合は使用しますint
パフォーマンス調整の最初のルールは、単純で明確なコードを書くことです。
この例では、パフォーマンスの違いはなく、println()があったとしても10,000倍の時間がかかり、概念的な違いが生じます。
プログラムがバイトコードでどのように表示されるかと、ネイティブコードでどのように表示されるかは異なります。
JVMではすべてのスロットが4バイトであるとは限りません。たとえば、64ビットマシンの参照は8バイトにすることができますが、それでも1つの「スロット」を使用します。
お使いのマシンにはスロットがありません。通常は32ビットまたは64ビットのレジスタがあります。
あなたの例では、バイト演算が使用されています。これはint演算と同じくらい効率的であり、異なる結果を生成する可能性があるため、引き続き必要です。
byte
注:またはフィールドを持つオブジェクトは、フィールドを持つオブジェクトshort
よりも小さくすることができint
ます。
この例では、JVMはc
1回計算できるため、a
またはb
このステートメントが実行されるときに実行されないように宣言byte a=3,b=5;
します。final byte a=3,b=5;
byte c = a+b;
byte
int
非効率を定義します。
はい、メモリ フットプリントは非効率に見えるかもしれませんが、今日のほとんどのプロセッサは 32 ビット (または 64 ビット) であることを覚えておいてください。1 バイトを 8 ビットのみで格納するには、プロセッサが 32 ビットのアドレス空間を取得し、それをシフトおよびクリーンアップして、必要な 8 ビットが適切な場所に配置されるようにする必要があります。