C プログラミングでは、変数を CPU レジスタに保持するために、register
指定子を使用します。同様に、JavaのCPUキャッシュにオブジェクトを保持するには、Javaに指定子がありますか
4 に答える
いいえ。
Java は (確かに C に比べて) 高水準言語であるため、この種の低水準機能に干渉することはできません。
C との追加の違いは、Java を実行するには VM が必要であることです。この VM は、おそらく、時々変化する多くのレジスタを必要とします。そのため、使用可能なレジスターの数と数は不明であるため、1 つを「要求」することができます。確かに、各 VM は (内部的に) 異なる動作をする可能性があるため、実際には方法があります。
Java (または標準 C AFAIK) では、オブジェクトがキャッシュ内にあるかどうかを制御することはできません。通常、レジスタに値を配置するために C でヒントを与える必要はありませんregister
。また、値がレジスタに格納されることを保証するものでもありません。
Java では、JIT はどの変数がレジスターにあるかを判別し、CPU はどのオブジェクト (またはそれらの一部) がどのキャッシュにあるかを判別します (3 つ以上持つことができます)。
どのような問題を解決しようとしていますか?
ところで: JIT を賢くしようとすると、コードが遅くなる可能性が高くなります。
いいえ、Java コンパイラ (すべき...) がそれを処理します。現代のコンパイラは、もはやそのような人間のヒントを必要としません (ほとんどの場合...)。
Java specification doesn't provide any such feature for programmers. But still JVM can use register's or other internal memory location for optimization purpose.
But Java does provide a feature to not cache or store value in register. This is done by declaring a field/data member volatile.