2

私の質問は次のとおりです。Javaの逆アセンブリから正しく取得した場合、

byte a=3,b=5;
System.out.println(a+b);

実際には byte の代わりに int を使用します。また、すべてのローカル メモリ スロットは、スタック スロットと同様に 4B です。バイト配列を割り当てる方がおそらく効率的であることは理解していますが、単一のバイト値を使用すると最終的に効率が悪いというのは本当ですか? (略して同点)

4

5 に答える 5

2

Java でbyteshortが存在するのは、主に範囲が狭い整数データ型ではないことを理解することが重要です。(十分に小さい) 数値が格納されるほとんどのint場合、有効な範囲が 0 ~ 100 であっても、 が使用されます。

byte何らかの外的要因により、処理するデータがそれらの範囲に制限される場合にshort使用されます。それらは、そのようなシステムとの対話を単純化するために存在します。

たとえば、最近のファイル システムはバイト ストリームを格納します。これらすべての読み取り/書き込み操作に使用できますが、データ型を使用すると操作が簡素化され、その区別が明確になります。intbyte

于 2011-04-14T11:53:16.543 に答える
2

+は整数演算です。それが理由です

byte c = a+b; // compile error

あなたが使用する必要があります

int c = a + b 

また

byte c = (byte)(a+b);

私のアドバイスはint、毎回キャストしないようにすることです。常にbyteバイトを使用する場合は、それ以外の場合は使用しますint

于 2011-04-14T11:47:56.863 に答える
1

パフォーマンス調整の最初のルールは、単純で明確なコードを書くことです。

この例では、パフォーマンスの違いはなく、println()があったとしても10,000倍の時間がかかり、概念的な違いが生じます。


プログラムがバイトコードでどのように表示されるかと、ネイティブコードでどのように表示されるかは異なります。

JVMではすべてのスロットが4バイトであるとは限りません。たとえば、64ビットマシンの参照は8バイトにすることができますが、それでも1つの「スロット」を使用します。

お使いのマシンにはスロットがありません。通常は32ビットまたは64ビットのレジスタがあります。

あなたの例では、バイト演算が使用されています。これはint演算と同じくらい効率的であり、異なる結果を生成する可能性があるため、引き続き必要です。

byte注:またはフィールドを持つオブジェクトは、フィールドを持つオブジェクトshortよりも小さくすることができintます。

この例では、JVMはc1回計算できるため、aまたはb

于 2011-04-14T11:51:05.553 に答える
0

このステートメントが実行されるときに実行されないように宣言byte a=3,b=5;します。final byte a=3,b=5;byte c = a+b;byteint

于 2011-04-14T11:51:24.067 に答える
0

非効率を定義します。

はい、メモリ フットプリントは非効率に見えるかもしれませんが、今日のほとんどのプロセッサは 32 ビット (または 64 ビット) であることを覚えておいてください。1 バイトを 8 ビットのみで格納するには、プロセッサが 32 ビットのアドレス空間を取得し、それをシフトおよびクリーンアップして、必要な 8 ビットが適切な場所に配置されるようにする必要があります。

于 2011-04-14T11:56:40.457 に答える