7

Cでは、変数にレジスタを割り当てることができます。次に例を示します。

register int i = 0;

私は、Javaがインタプリタ言語であり、CPUから離れた多くの抽象化であることを認識しています。

キャッシュやメインメモリに移動する代わりに、変数をレジスタに残しておくように要求するために利用できるメカニズムはありますか(アーキテクチャで許可されていない場合はどうなりますか)?

方法はないと思いますが、以前は嬉しい驚きでした。

ありがとうございました、

4

6 に答える 6

18

registerCでは登録する変数を置きません。それは単にコンパイラにヒントを与えるだけであり、それをレジスタに入れるのがおそらく良いでしょう。

Javaには同等のものはありません。

于 2009-02-11T21:00:33.090 に答える
6

短いスペースで十分に使用され、レジスタintにする価値がある場合は、ホットスポットコンパイラがそれを理解できるはずです。

実際、ホットスポットコンパイラは、処理する情報が多いため、C /C++コンパイラよりも優れた処理を実行できるはずです。C /C++コンパイラは推測する必要があります。HotSpotは測定できます。

于 2009-02-11T21:00:51.967 に答える
5

Javaには同等のものはありません。Cでも、変数がレジスターに格納されるという保証はなく、コンパイラーはそれを自由に無視できます。

Javaでは、ホットスポットJITがコンパイルする必要があるとヒューリスティックに判断するまで、メソッドは解釈されます。コンパイルされたコードの場合、カラーリングアルゴリズムを使用して変数と一時値をレジスタに割り当てるか、レジスタオーバーフローの場合はRAMとの間で書き込みを行います。

于 2009-02-11T21:01:25.150 に答える
3

いいえ、Javaでこれを要求する方法はありません。volatileただし、メンバー変数に修飾子を適用するなど、レジスターが使用されないようにするために実行できることがいくつかあります。

于 2009-02-11T21:00:58.097 に答える
3

Java はインタプリタ言語であり、CPU から離れた多くの抽象化であることを認識しています。

あなたはそこであなた自身の質問にほとんど答えました:-)

しかし、真剣に、一般に、コードをできるだけ明確かつ単純に記述してください。そうすれば、JVM はコードを正しく処理するためにできる限りのことを行います。

于 2009-02-11T22:19:26.957 に答える
0

@register というアノテーションを作成できますが、JVM は間違いなくそれを無視します。例えば

@register int i = 0;
于 2009-02-12T21:23:29.767 に答える